¿Por qué scanf parece omitir la entrada?

Estoy confundido sobre el comportamiento de scanf en el siguiente programa. scanf parece ingresar una vez, y luego no volver a ingresar, hasta que se imprime un flujo de caracteres.

Abajo en un programa de C

#include<stdio.h>
int main()
{
    int i, j=0;

    do
    {
        ++j;
        scanf("%d", &i);
        printf("\n\n%d %d\n\n", i, j);
    }
    while((i!=8) && (j<10));  

    printf("\nJ = %d\n", j);
    return 0;
}

aquí, Hasta que ingrese cualquier programa de enteros funciona perfectamente bien, pero cuando se ingresa un carácter, continúa imprimiendo el último valor ingresado de i y nunca se detiene (hasta que j es 10 cuando el bucle sale) para que scanf tome la siguiente entrada.

output::  
1    <-----1st input
1 1
2    <---- 2nd input
2 2
a    <---- character input
2 3  
2 4
2 5
2 6
2 7
2 8
2 9
2 10

J = 10  

Lo mismo está sucediendo en c ++ también.

#include<iostream>
using namespace std;
int main()
{
    int i, j=0;

    do
    {
        ++j;
        cin>>i;
        cout<<i<<" "<<j<<"\n";
    }
    while((i!=8) && (j<10));

    cout<<"\nj = "<<j<<"\n";
}   


output of c++ program ::  
1     <-----1st input
1 1
2     <-----2nd input
2 2
a    <------ character input
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10

j = 10  

el único cambio en c ++ es que se está imprimiendo 0 en lugar del último valor.

Sé que aquí los valores enteros son esperados por el programa, pero quiero saber qué sucede cuando se ingresa un carácter en lugar de un entero. ¿Cuál es la razón de todo lo que sucede arriba?

Respuestas a la pregunta(7)

Su respuesta a la pregunta