scanf () deja la nueva línea char en el búfer

Tengo el siguiente progtwig:

int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&c1); // line 3 printf("Enter another char: "); scanf("%c", &c2); // line 4 printf("Done"); // line 5 system("PAUSE"); return 0; } 

Mientras leo en el libro C, el autor dice que scanf() dejó un nuevo carácter de línea en el búfer, por lo tanto, el progtwig no se detiene en la línea 4 para que el usuario ingrese los datos, sino que almacena el nuevo carácter de línea en c2 y pasa a la línea 5.

¿Está bien?

Sin embargo, ¿esto solo sucede con los tipos de datos de char ? Porque no vi este problema con los tipos de datos int como en la línea 1, 2, 3. ¿Es correcto?

La función scanf() elimina el espacio en blanco automáticamente antes de intentar analizar conversiones que no sean caracteres. Los formatos de caracteres (principalmente %c ; también los conjuntos de escaneos %[…] – y %n ) son la excepción; ellos no eliminan el espacio en blanco.

Use " %c" con un espacio en blanco para saltear el espacio en blanco opcional. No utilice un espacio en blanco al final en una cadena de formato scanf() .

Tenga en cuenta que esto todavía no consume ningún espacio en blanco al final en el flujo de entrada, ni siquiera al final de una línea, así que ten cuidado con eso si también usas getchar() o fgets() en el mismo flujo de entrada. Recién estamos obteniendo scanf para saltear espacios en blanco antes de conversiones, como lo hace para %d y otras conversiones que no son de carácter.


Tenga en cuenta que las “directivas” que no son espacios en blanco (para usar la terminología POSIX scanf ) distintas de las conversiones, como el texto literal en scanf("order = %d", &order); no salta espacios en blanco tampoco. El order literal debe coincidir con el siguiente carácter que se leerá.

Por lo tanto, probablemente desee " order = %d" allí si desea omitir una nueva línea de la línea anterior, pero todavía necesita una coincidencia literal en una cadena fija, como esta pregunta .

Use scanf(" %c", &c2); . Esto resolverá su problema.

Use getchar() antes de llamar a second scanf() .

 scanf("%c", &c1); getchar(); // < == remove newline scanf("%c", &c2);