Por que o scanf () está causando loop infinito nesse código?

Eu tenho um pequeno programa C que apenas lê números de stdin, um em cada ciclo de loop. Se o usuário inserir algum NaN, um erro deve ser impresso no console e o prompt de entrada deve retornar novamente. Na entrada de "0", o loop deve terminar e o número de valores positivos / negativos deve ser impresso no console. Aqui está o programa:

#include <stdio.h>

int main()
{
    int number, p = 0, n = 0;

    while (1) {
        printf("-> ");
        if (scanf("%d", &number) == 0) {
            printf("Err...\n");
            continue;
        }

        if (number > 0) p++;
        else if (number < 0) n++;
        else break; /* 0 given */
    }

    printf("Read %d positive and %d negative numbers\n", p, n);
    return 0;
}

Meu problema é que, ao entrar em algum não-número (como "a"), isso resulta em um loop infinito escrevendo "-> Err ..." repetidamente. Eu acho que é um problema scanf () e eu sei que essa função pode ser substituída por uma mais segura, mas este exemplo é para iniciantes, sabendo apenas sobre printf / scanf, if-else e loops.

Eu já li as respostas paraessa questão e folheou outras perguntas, mas nada realmente responde a esse problema específico.

questionAnswers(13)

yourAnswerToTheQuestion