Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/10/2014, 06:51
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 10 años, 3 meses
Puntos: 83
Respuesta: Restringir numero maximo de caracteres

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 original
  1. char get_string(char *buffer, int bffsz, char *titulo) {
  2.     char c;
  3.     int excede;
  4.  
  5.     while(1) {
  6.         printf(titulo);
  7.  
  8.         //lee de stdin
  9.         if(fgets(buffer, bffsz, stdin) != 0) {
  10.  
  11.             //entrada positiva
  12.             if(strlen(buffer) < bffsz-1) {
  13.                 printf("<entrada positiva>\n\n");
  14.                 return 0;
  15.             }
  16.  
  17.             //posible entrada negativa
  18.             //recupero los caracteres dejados en el stdin
  19.             excede = 0;
  20.             while((c = getchar()) != EOF && c != '\n') {
  21.                 excede++;
  22.             }
  23.  
  24.             //si no hay caracteres textuales será una falsa entrada negativa
  25.             if(excede == 0) {
  26.                 printf("<falsa entrada negativa>\n\n");
  27.                 return 0;
  28.             }
  29.  
  30.             //en cualquier otro caso es una entrada negativa
  31.             //en buffer tienes los datos truncados a bffsz caracteres
  32.             printf("<entrada negativa, excede en %d caracteres>\n\n", excede);
  33.         }
  34.     }
  35.  
  36.     return 1;
  37. }

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 original
  1. char bff[10];
  2. if(!get_string(bff, 10, "Dime una frase (max 9 chars): ")) {
  3.     printf("Acepto %s\n", bff);
  4. }
  5. else {
  6.     //se produjo un error en la lectura de datos
  7.     //comprovar feof(stdin) y ferror(stdin)
  8. }

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