scanf ("%d") tem o seguinte comportamento: ele vai tentar procurar, nas coisas que você digitou, algo que se pareça com um número. Eu realmente não gosto muito de scanf porque ele é meio “mané” mesmo.
Outra forma de fazer que me veio à cabeça:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
char strIdade [20];
int ok = 0;
int idade;
while (1) {
printf ("Entre com a idade: ");
gets (strIdade);
if (sscanf (strIdade, "%d", &idade) != 1)
{
fprintf (stderr, "Por favor, entre com um valor numérico.\n");
}
else
{
break;
}
};
printf ("O valor entrado foi: %d\n", idade);
system ("pause");
return 0;
}
Entretanto, dessa maneira, se você entrar com a string “7cabecas”, por exemplo, ele aceita o valor 7.
É não tem como você manda fazer isso, por que um caracter lido como inteiro vira um numero, o que você pode fazer é testar um scanf num while e se não for número ele apenas apaga o que foi escrito e fica esperando outro input.