Hay algunos trucos para hacerlo con scanf pero esa funcion no fue diseñada para este tipo de comprovaciones; basandote en la forma de trabajar de scanf puedes tunear un poco el ingreso de datos:
Código:
int x;
printf("Entra un entero: ");
while(scanf("%d", &x) != 1) {
//limpias stdin, despues te comento como no usar fflush(stdin)
printf("No valido, entra un entero: ");
}
El scanf retorna el nº de elementos cargados del tipo indicado, es decir que si pides un entero y entras una letra resulta que lee 0 elementos y retorna 0; en este caso pido un entero y solo funcionará cuando retorne que ha leido un elemento de tipo entero ok?
La otra forma las controlada es usar fgets para leer en forma de texto y convertir a entero con strtol, tambien tienes que tunear el codigo un poco; un ejemplo:
Código:
long int x;
char strnum[10], *pch;
printf("Entra entero: ");
if(fgets(strnum, sizeof(strnum), stdin) != NULL) {
pch = NULL;
x = strtol(strnum, &pch, 10);
if(pch[0] == 10) {
printf("%d ok", x);
}
else {
printf("error");
}
}
Tal vez visto asi sea mas practico usar el primer ejemplo, pero te lo puedes poner en una funcion aparte y usar el bucle para llamarla.
Otra cosa, no uses stdin con fflush porque esa funcion no sirve para el stream de entrada; en cambio debes usar algo que vaya leyendo del stdin hasta vaciarlo, puedes usar esta funcion como propia (puedes encontrarla por ahi bajo mil nombres diferentes):
Código:
void fflush_stdin() {
while (getchar() != '\n');
}
//en el codigo
scanf("%d", &x);
fflush_stdin();
Y la libreria conio no es estandar. Aun otra cosa, lo de 'int true;' es valido? Creo que deberias dejarlo como macro para que funcione correctamente, o como enum:
Código:
#define FALSE 0
#define TRUE 1
enum L_BOOLEAN_VALUES {false, true};
Saludos
vosk