usando scanf("% d") con un espacio después de% d
pointers (1)
En mi clase c de hoy estaba teniendo problemas con el comando scanf (), solo estábamos aprendiendo punteros y recibimos una pregunta que nos pedía que obtuviéramos una matriz e imprimiéramosla sin usar el [] para nada más que declarar la matriz (int) . Por supuesto, parece pan comido, pero no cuando escribes accidentalmente:
scanf ("% d", arr + i);
¿Notaste el espacio después de% d? Claro que me tomó un tiempo entenderlo, pero por alguna razón eso hace que los bucles se vuelvan locos, y quería que ustedes me ayudaran (y mis maestros) a descubrir por qué sucede eso. Ejemplo:
#include <stdio.h>
#define LEN 10
void arrayInput(int * arr, unsigned int len);
void arrayReverseOutput(int * arr, unsigned int len);
int main(void)
{
int arr[LEN] = { 0 };
arrayInput(arr, LEN);
arrayReverseOutput(arr, LEN);
system("pause");
return 0;
}
void arrayInput(int * arr, unsigned int len)
{
unsigned int i = 0;
printf("Enter 10 numbers: ");
for (i = 0; i < len; i++)
{
//printf("i = %d /n", i); see what happens when you use this line
scanf("%d ", arr + i);
}
}
void arrayReverseOutput(int * arr, unsigned int len)
{
int i = 0;
printf("The numbers in reverse order: ");
for (i = --len; i >= 0; i--)
{
printf("%d ", *(arr + i));
}
}
Tengo mucha curiosidad por ver qué sucede con ese scanf ... es como si requiriera 2 entradas la primera vez que se ejecuta, pero de alguna manera todavía logra colocar las entradas en su posición correcta en la matriz ... Gracias por tomar su tiempo para leer esto <3
Un espacio en la cadena de formato le dice a
scanf()
que coincida con cero o más caracteres de espacio en blanco, hasta que la coincidencia falle.
Los espacios (
'' ''
), las nuevas líneas (
''/n''
), los retornos de carro (
''/r''
) y las pestañas (
''/t''
) se encuentran entre los espacios en blanco.
Cuando se produce un espacio al final de una cadena de formato,
scanf()
intentará hacer coincidir los espacios en blanco de la entrada hasta que no se encuentre ninguna coincidencia.
Pero
scanf()
solo puede regresar cuando falla una coincidencia o se alcanza el final del archivo.
Por lo tanto, en el caso de una declaración como:
scanf("%d ", arr + i);
la llamada a
scanf()
parecerá colgar, esperando ansiosamente más información del usuario.
Cada vez que se presiona la tecla
Intro
, una nueva línea se envía y coincide con
scanf()
, que todavía está esperando una coincidencia fallida.
O al final del archivo.
Puede escapar de este bucle señalando el final del archivo desde el teclado con
Ctrl-D
en Linux o
Ctrl-C
en Windows.
Casi siempre es un error terminar una cadena de formato
scanf()
con un espacio.
Una nueva línea (
''/n''
) también es un carácter de espacio en blanco, y tiene el mismo efecto cuando se coloca al final de una cadena de formato.
Tenga en cuenta que los espacios se pueden usar de manera efectiva en cadenas de formato
scanf()
.
Por ejemplo:
int retval = scanf(" %c %c", &c1, &c2);
Aquí, si una operación de E / S anterior ha dejado una nueva línea en la secuencia de entrada (una ocurrencia no infrecuente), el espacio en blanco
scanf()
dirige
scanf()
para leerlo e ignorarlo.
El segundo espacio en la cadena de formato le dice a
scanf()
que espere cero o más caracteres de espacio en blanco entre los caracteres de entrada para convertir.
Esto permite al usuario ingresar los caracteres con un espacio intermedio.
Sin el espacio en blanco agregado, si un usuario ingresó
ab/n
,
c2
terminaría manteniendo el valor de un carácter de espacio, y la
b
se quedaría atrás en la secuencia de entrada para que la próxima operación de E / S la recoja.
También tenga en cuenta que
scanf()
devuelve el número de conversiones exitosas, permitiendo que el programa verifique si la entrada es la esperada.
Si
retval
en la línea anterior no es
2
, algo ha salido mal.