Estoy intentando tomar información del usuario que contiene un grupo de números de 1 a 3 dígitos delimitados por espacios usando scanf () y almacenarlos en una matriz int e imprimir cada uno por separado en una nueva línea para probar, pero no funciona. Aquí está lo que tengo hasta ahora:
#include #include int main() { int sourceArr[500]; int i = 0; printf("\nEnter ciphertext: \n"); while (scanf("%d", &sourceArr[i++]) == 1); for (int j=0;j<500;j++) { printf("%d\n", sourceArr[j]); } }
por lo que se le pide al usuario que ingrese una secuencia de números así:
Enter ciphertext: 23 122 32
y quiero almacenar 23 en sourceArr [0], 122 en sourceArr [1] y 32 en sourceArr [2] y luego imprimir cada uno de esta manera:
23 122 32
Pero el progtwig queda inactivo justo después de ingresar la entrada y no imprime los números.
El "%d"
consume espacios en blanco iniciales como ' '
y '\n'
, no solo ' '
.
Entonces, cuando el usuario ingresa “123 456 789” Entrar , se vuelve a llamar a scanf()
espera de más entrada. Continuará esperando hasta que se ingresen datos no numéricos, la stdin
se cierre o rara vez experimente un error de IO.
Dado que stdin
normalmente está en búfer, stdin
y scanf()
no ven ninguna entrada de una línea hasta que se presiona la tecla Enter .
while (scanf("%d", &sourceArr[i++]) == 1);
Si el código debe terminar la entrada con Enter , use fgets()
para leer una línea . Luego analízalo usando sscanf()
o strtol()
. La siguiente información utiliza "%n"
para registrar el número de caracteres explorados.
char buf[100]; printf("\nEnter ciphertext: \n"); if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF(); char *p = buf; int n; while (sscanf(p, "%d%n", &sourceArr[i], &n) == 1) { i++; p += n; } for (int j = 0; j < i; j++) { printf("%d\n", sourceArr[j]); }
En caso de éxito, scanf devuelve el número de elementos de la lista de argumentos completados correctamente. Este recuento puede coincidir con el número esperado de elementos o ser menor (incluso cero) debido a una falla coincidente, un error de lectura o el scope del final del archivo.
Podrías cambiarlo a:
#include #include int main() { int sourceArr[500]; int i = 0; printf("\nEnter ciphertext: \n"); while (scanf("%d", &sourceArr[i++]) == 1); for (int j=0;j
Luego, si ingresas: 1 2 3 4 5 6 x (y pulsa enter)
Se mostrará como quieras.
Si no te gusta la 'x', puedes usar esta línea de tiempo:
while (scanf("%d", &sourceArr[i++]) != EOF);
y luego escribe algo como: 12 23 345 554 (pulsa enter) y luego (ctrl + z) en windows o (ctrl + d) en unix.
vea este hilo: Fin de archivo (EOF) de la secuencia de entrada estándar (stdin)
ctrl + z hace que scanf devuelva EOF explícitamente porque la consola no tiene EOF y debe enviarse de esta manera.