¿Por qué Scanf solicita dos veces la entrada cuando hay una nueva línea al final de la cadena de formato?

#include  #include  #include  char *method1(void) { static char a[4]; scanf("%s\n", a); return a; } int main(void) { char *h = method1(); printf("%s\n", h); return 0; } 

Cuando ejecuto el código anterior, el aviso me pide dos veces la entrada (solo uso scanf una vez en el código). ¿Porqué es eso?

(Ingresé ‘jo’; me pidió más información, así que ingresé ‘jo’ nuevamente. Luego solo imprimí ‘jo’ una vez).

De mi página de manual de scanf

El espacio en blanco (como espacios en blanco, tabs o líneas nuevas) en la cadena de formato coincide con cualquier cantidad de espacio en blanco, incluido ninguno, en la entrada. Todo lo demás solo coincide solo.

Por lo tanto, con scanf ("%s\n", a) buscará una cadena seguida de un espacio en blanco opcional. Dado que después de la primera nueva línea pueden aparecer más espacios en blanco, el escaneo no se realiza después de la primera línea nueva y mira lo que viene a continuación. Notará que puede ingresar cualquier número de nuevas líneas (o tabs o espacios) y scanf aún esperará más.

Sin embargo, cuando ingresa la segunda cadena, la secuencia de espacios en blanco se delimita y el escaneo se detiene.

Use scanf ("%s", a) para no escanear espacios en blanco al final.

tienes que eliminar el \n del formato de cadena del scanf . Debería ser

 scanf("%s",a); 

EDITAR: Explicación

%s significa que el scanf lee el carácter de entrada hasta que obtiene un delimitador que debe ser un espacio en blanco como espacio o pestaña o una nueva línea ( \n ), de modo que la primera entrada es obtener como delimitador del "%s" y agregar el "\n" al formato de cadena "%s\n" significa que el scanf esperará 2 líneas nuevas, la primera línea nueva está relacionada con el delimitador de "%s" y la segunda línea nueva está relacionada con el \n de la cadena formato.

use gets () o fgets () en su lugar … alternativamente use scanf (“% [^ \ n] s”, a);

No use la secuencia de escape en la función scanf stdio

  scanf ("%s", a); 

Elimina \n del formato scanf y da una entrada y muestra la salida en función del resultado dado una vez.