Problema con el uso de fgets()/gets()/scanf() después de scanf() en C

scanf() es una función de biblioteca en C. Lee la entrada estándar de stdin. fgets() es una función de biblioteca en C. Lee una línea del flujo especificado y la almacena en la string a la que apunta la variable de string. Solo termina cuando:

  • se alcanza el final del archivo
  • se leen n-1 caracteres
  • se lee el carácter de nueva línea

1) Considere un programa simple a continuación en C. El programa lee un número entero usando scanf(), luego lee una string usando fgets(),

Aporte  

10
test

C

// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
  
int main()
{
    int x;
    char str[100];
    scanf("%d", &x);
    fgets(str, 100, stdin);
    printf("x = %d, str = %s", x, str);
    return 0;
}

Producción

x = 10, str = 

Explicación: el problema con el código anterior es que scanf() lee un número entero y deja un carácter de nueva línea en el búfer. Por lo tanto, fgets() solo lee la nueva línea y el programa ignora la string «prueba».

2) El problema similar ocurre cuando se usa scanf() en un bucle. 

Aporte:

a
b
q 

C

// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
  
int main()
{
    char c;
    printf("Press q to quit\n");
    do {
        printf("Enter a character\n");
        scanf("%c", &c);
        printf("%c\n", c);
    } while (c != 'q');
    return 0;
}

Producción 

Press q to quit
Enter a character
a
Enter a character


Enter a character
b
Enter a character


Enter a character
q

Explicación: podemos notar que el programa anterior imprime un «Ingrese un carácter» adicional seguido de una nueva línea adicional. Esto sucede porque cada scanf() deja un carácter de nueva línea en un búfer que lee el siguiente scanf.

¿Cómo resolver el problema anterior?  

  • Podemos hacer que scanf() lea una nueva línea usando un \n adicional , es decir, scanf(“%d\n”, &x) . De hecho, scanf(“%d”, &x) también funciona (tenga en cuenta el espacio extra).
  • Podemos agregar un getchar() después de scanf() para leer una nueva línea adicional.

Los programas corregidos de los puntos anteriores serán,

1) scanf() cuando hay fgets() después:

Aporte:

10
test

C

// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
  
int main()
{
    int x;
    char str[100];
    scanf("%d\n", &x);
    fgets(str, 100, stdin);
    printf("x = %d, str = %s", x, str);
    return 0;
}

Producción

x = 10, str = test

2) Cuando se usa scanf() en un bucle: 

Aporte:

a
b
q 

C

// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
  
// Driver Code
int main()
{
    char c;
    printf("Press q to quit\n");
    do {
        printf("Enter a character\n");
        scanf("%c\n", &c);
        printf("%c\n", c);
    } while (c != 'q');
    return 0;
}

Salida: presione q para salir

Enter a character
a
Enter a character
b
Enter a character
q

Debe leer: se produce un problema con Scanner en Java cuando se usa nextLine() después de nextXXX()

Este artículo es una contribución de Dheeraj Gupta . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *