Lea en números delimitados por espacios usando scanf y almacenándolos en una matriz – C

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.