¿Por qué scanf () causa un bucle infinito en este código?

Tengo un pequeño programa C que solo lee los números de la entrada estándar, uno en cada ciclo de bucle. Si el usuario ingresa algo de NaN, se debe imprimir un error en la consola y la solicitud de entrada debe regresar nuevamente. En la entrada de "0", el bucle debe finalizar y el número de valores positivos / negativos dados debe imprimirse en la consola. Aquí está el 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;
}

Mi problema es que al ingresar un número no numérico (como "a"), esto se traduce en una escritura de bucle infinito "-> Err ..." una y otra vez. Supongo que es un problema de scanf () y sé que esta función podría ser reemplazada por una más segura, pero este ejemplo es para principiantes, que solo conocen printf / scanf, if-else y loops.

Ya he leído las respuestas aesta pregunta y repasó otras preguntas, pero nada realmente responde a este problema específico.

Respuestas a la pregunta(13)

Su respuesta a la pregunta