Borrar el búfer de entrada en C/C++

¿Qué es un búfer?  
Un área de almacenamiento temporal se llama un búfer. Todos los dispositivos de entrada y salida estándar contienen un búfer de entrada y salida. En C/C++ estándar, las secuencias se almacenan en búfer. Por ejemplo, en el caso de la entrada estándar, cuando presionamos la tecla en el teclado, no se envía a su programa, sino que el sistema operativo lo envía al búfer, hasta que se le asigna el tiempo a ese programa. .

¿Cómo afecta a la Programación?  
En varias ocasiones, es posible que deba borrar el búfer no deseado para obtener la siguiente entrada en el contenedor deseado y no en el búfer de la variable anterior. Por ejemplo, en el caso de C después de encontrar «scanf()», si necesitamos ingresar una array de caracteres o carácter, y en el caso de C++, después de encontrar la declaración «cin», necesitamos ingresar una array de caracteres o una string, requerimos borrar el búfer de entrada o la entrada deseada está ocupada por un búfer de la variable anterior, no por el contenedor deseado. Al presionar «Enter» (retorno de carro) en la pantalla de salida después de la primera entrada, como el búfer de la variable anterior era el espacio para un nuevo contenedor (ya que no lo borramos), el programa salta la siguiente entrada de la envase.

En el caso de la Programación en C 

C

// C Code to explain why not
// clearing the input buffer
// causes undesired outputs
#include<stdio.h>
int main()
{
    char str[80], ch;
     
    // Scan input from user -
    // GeeksforGeeks for example
    scanf("%s", str);
     
    // Scan character from user-
    // 'a' for example
    ch = getchar();
     
    // Printing character array,
    // prints “GeeksforGeeks”)
    printf("%s\n", str);
     
    // This does not print
    // character 'a'
    printf("%c", ch);
     
    return 0;
}

Aporte: 

GeeksforGeeks
a

Producción: 

GeeksforGeeks

Complejidad de tiempo: O(1) 

En el caso de C++ 

C++

// C++ Code to explain why
// not clearing the input
// buffer causes undesired
// outputs
#include<iostream>
#include<vector>
using namespace std;
 
int main()
{
    int a;
    char ch[80];
     
    // Enter input from user
    // - 4 for example
    cin >> a;
     
    // Get input from user -
    // "GeeksforGeeks" for example
    cin.getline(ch,80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string : This does
    // not print string
    cout << ch << endl;
     
    return 0;
}

Aporte: 

4
GeeksforGeeks

Producción: 

4

Complejidad de tiempo: O(1)

En los dos códigos anteriores, la salida no se imprime como se desea. La razón de esto es un búfer ocupado. El carácter «\n» permanece allí en el búfer y se lee como la siguiente entrada.

¿Cómo se puede resolver?

En el caso de C:  

1. Usando “ while ((getchar()) != ‘\n’); ” : Escribiendo “while ((getchar()) != ‘\n’);” lee los caracteres del búfer hasta el final y los descarta (incluida la nueva línea) y los usa después de que la declaración «scanf()» borre el búfer de entrada y permita la entrada en el contenedor deseado.

C

// C Code to explain why adding
// "while ( (getchar()) != '\n');"
// after "scanf()" statement
// flushes the input buffer
#include<stdio.h>
 
int main()
{
    char str[80], ch;
     
    // scan input from user -
    // GeeksforGeeks for example
    scanf("%s", str);
     
    // flushes the standard input
    // (clears the input buffer)
    while ((getchar()) != '\n');
     
    // scan character from user -
    // 'a' for example
    ch = getchar();
     
    // Printing character array,
    // prints “GeeksforGeeks”)
    printf("%s\n", str);
     
    // Printing character a: It
    // will print 'a' this time
    printf("%c", ch);
 
    return 0;
}

Aporte: 

GeeksforGeeks
a

Producción: 

GeeksforGeeks
a

Complejidad de tiempo: O(n), donde n es el tamaño de la string. 

2. Usar «fflush(stdin)» : Al escribir «fflush(stdin)» después de la declaración «scanf()», también se borra el búfer de entrada, pero generalmente se evita su uso y se denomina «indefinido» para el flujo de entrada según el Estándares C++11.

En el caso de C++:  

1. Usando “ cin.ignore(numeric_limits::max(),’\n’); ” :- Escribiendo “cin.ignore(numeric_limits::max(),’\n’);” después de la declaración «cin» descarta todo en el flujo de entrada, incluida la nueva línea. 

C++

// C++ Code to explain how
// "cin.ignore(numeric_limits
// <streamsize>::max(),'\n');"
// discards the input buffer
#include<iostream>
 
// for <streamsize>
#include<ios>    
 
// for numeric_limits
#include<limits>
using namespace std;
 
int main()
{
    int a;
    char str[80];
     
    // Enter input from user
    // - 4 for example
    cin >> a;
     
    // discards the input buffer
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
     
    // Get input from user -
    // GeeksforGeeks for example
    cin.getline(str, 80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string : This
    // will print string now
    cout << str << endl;
 
    return 0;
}

Aporte: 

4
GeeksforGeeks

Producción: 

4
GeeksforGeeks

Complejidad de tiempo: O(1) 

2. Usando “ cin.sync() ”: Al escribir “cin.sync()” después de la instrucción “cin”, se descarta todo lo que queda en el búfer. Aunque “cin.sync()” no funciona en todas las implementaciones (de acuerdo con los estándares C++11 y superiores). 

C++

// C++ Code to explain how " cin.sync();"
// discards the input buffer
#include<iostream>
#include<ios>    
#include<limits>
using namespace std;
 
int main()
{
    int a;
    char str[80];
     
    // Enter input from user
    // - 4 for example
    cin >> a;
     
    // Discards the input buffer
    cin.sync();
     
    // Get input from user -
    // GeeksforGeeks for example
    cin.getline(str, 80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string - this
    // will print string now
    cout << str << endl;
 
    return 0;
}

Aporte: 

4
GeeksforGeeks

Producción: 

4

Complejidad de tiempo: O(1) 

3. Usando “cin >> ws”: Escribir “cin>>ws” después de la declaración “cin” le dice al compilador que ignore el búfer y también que descarte todos los espacios en blanco antes del contenido real de la string o array de caracteres. 

C++

// C++ Code to explain how "cin >> ws"
// discards the input buffer along with
// initial white spaces of string
 
#include<iostream>
#include<vector>
using namespace std;
 
int main()
{
    int a;
    string s;
     
    // Enter input from user -
    // 4 for example
    cin >> a;
     
    // Discards the input buffer and
    // initial white spaces of string
    cin >> ws;
     
    // Get input from user -
    // GeeksforGeeks for example
    getline(cin, s);
     
    // Prints 4 and GeeksforGeeks :
    // will execute print a and s
    cout << a << endl;
    cout << s << endl;
 
    return 0;
}

Aporte: 

4
GeeksforGeeks

Producción: 

4
GeeksforGeeks

Complejidad de tiempo: O(1) 

Este artículo es una contribución de Manjeet Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
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 *