Cuando ingreso más de 3 cifras todo funciona a la perfección
Porque si introduces como mínimo cuatro caracteres, por ejemplo:
La función fgets al estar limitada a cinco caracteres (incluyendo el '\0') almacenara los caracteres '1', '2', '3', '4' y '\0' en el array. El carácter '\n' se queda en el bufer de la entrada estándar.
Cuando se ejecuta el bucle:
;
Este procesa el resto de la linea hasta encontrar el '\n', cuando eso sucede la condición es falsa y causa la terminación del bucle.
Por cierto el bucle esta mal, la variable "ch" debe ser de tipo "signed int" y se debe verificar si el resultado de getchar es EOF. Debería ser:
int ch;
/* ... */
while ((ch
= getchar()) != EOF
&& ch
!= '\n') ;
pero si ingreso menos de 4 el programa se queda detenido en el bucle while de limpieza de buffer de teclado
Porque en este escenario con un máximo de tres caracteres mas el avance de linea, por ejemplo:
La función fgets almacena
todos los caracteres en el array. Cuando se ejecuta el bucle para descartar el resto de la linea no hay tal (por ello se debe teclear una linea adicional).
----
En cuanto al primer programa de
vangodp este da la apariencia de no funcionar correctamente, se sostiene porque varios errores se cancelan mutuamente. Por ejemplo si se ejecuta e introduce:
Su salida es:
Ingrese un entero....:123
Ingresaste..: 12 -----> longitud = 3
0 para continuar otro para salir....:
Ello porque el espacio causa que el bucle donde se descarta el resto de la linea se ejecute por lo menos una ves y con ello se pierde el ultimo carácter.
En ese programa se debe considerar que los especificadores "%s" y "%d" descartan el espacio blanco (espacio, tabulador, etc.) y por ello los bucles de soporte no son necesarios. El programa se puede reducir a:
#include <stdio.h>
int main(void)
{
char palabra[7];
int ok;
do {
puts("Introduce una palabra:"); if (scanf("%s", palabra
) != 1) break;
printf("Ingresaste: %s\n", palabra
);
puts("0 para continuar otro para salir:"); }while (scanf("%d" , &ok
) == 1 && ok
== 0);
return 0;
}
Sin embargo "%s" se debe evitar ya que tiene el mismo defecto que la función gets (mejor utilizar "%Ns" o bien fgets).
Un saludo