Tienes que limitar la lectura con fgets para que funcione; te dejo un ejemplo de funcion para que veas como implementarlo:
Código C:
Ver originalchar get_string(char *buffer, int bffsz, char *titulo) {
char c;
int excede;
while(1) {
//lee de stdin
if(fgets(buffer
, bffsz
, stdin
) != 0) {
//entrada positiva
if(strlen(buffer
) < bffsz
-1) { printf("<entrada positiva>\n\n"); return 0;
}
//posible entrada negativa
//recupero los caracteres dejados en el stdin
excede = 0;
while((c
= getchar()) != EOF
&& c
!= '\n') { excede++;
}
//si no hay caracteres textuales será una falsa entrada negativa
if(excede == 0) {
printf("<falsa entrada negativa>\n\n"); return 0;
}
//en cualquier otro caso es una entrada negativa
//en buffer tienes los datos truncados a bffsz caracteres
printf("<entrada negativa, excede en %d caracteres>\n\n", excede
); }
}
return 1;
}
Lo he comentado dentro del codigo. Ten en cuenta que fgets siempre deja un \0 final, es decir que si lo limitas a 10 caracteres habra 9 de significativos mas el \0 final; ten en cuenta tambien que fgets retorna nulo en caso de error de lectura (no se considera error el truncado de caracteres).
Ahora un ejemplo de llamada:
Código C:
Ver originalchar bff[10];
if(!get_string(bff, 10, "Dime una frase (max 9 chars): ")) {
}
else {
//se produjo un error en la lectura de datos
//comprovar feof(stdin) y ferror(stdin)
}
Tambien puedes hacerlo directamente con getchar recuperando el nº de caracteres o hasta encontrar EOF o enter (\n), si despues de esto no queda el stdin vacío es que el usuario se excedio de caracteres (es lo que hago en la funcion para verificar el estado del buffer de stdin).
Espero que te sea de ayuda
Saludos
vosk