Рубрики

Очистка входного буфера в C / C ++

Что такое буфер?
Область временного хранения называется буфером. Все стандартные устройства ввода и вывода содержат буфер ввода и вывода. В стандартном C / C ++ потоки буферизуются, например, в случае стандартного ввода, когда мы нажимаем клавишу на клавиатуре, она не отправляется в вашу программу, а буферизируется операционной системой до тех пор, пока время не будет выделено для этого. программа.


Как это влияет на программирование?

В некоторых случаях вам может потребоваться очистить ненужный буфер, чтобы получить следующий ввод в желаемом контейнере, а не в буфере предыдущей переменной. Например, в случае C после встречи с «scanf ()», если нам нужно ввести массив символов или символ, и в случае C ++, после встречи с оператором «cin», мы требуем ввести массив символов или строку, нам нужно очистить буфер ввода, иначе желаемый ввод будет занят буфером предыдущей переменной, а не нужным контейнером. При нажатии «Enter» (возврат каретки) на экране вывода после первого ввода, поскольку буфер предыдущей переменной был пространство для нового контейнера (как мы его не очищали), программа пропускает следующий ввод контейнера.

В случае программирования C

// C код, чтобы объяснить, почему нет
// очищаем входной буфер
// вызывает нежелательные выходы
#include<stdio.h>

int main()

{

    char str[80], ch;

      

    // Сканирование ввода от пользователя -

    // GeeksforGeeks например

    scanf("%s", str);

      

    // Сканирование символа от пользователя

    // 'a' например

    ch = getchar();

      

    // Печать массива символов,

    // печатает «GeeksforGeeks»)

    printf("%s\n", str);

      

    // Это не печатает

    // символ 'a'

    printf("%c", ch);

      

    return 0;

}

Входные данные:

GeeksforGeeks
a

Выход:

GeeksforGeeks

В случае C ++

// C ++ код, объясняющий почему
// не очищаем ввод
// буфер вызывает нежелательное
// выводы
#include<iostream>
#include<vector>

using namespace std;

  

int main()

{

    int a;

    char ch[80];

      

    // Введите ввод от пользователя

    // - 4 например

    cin >> a;

      

    // Получить ввод от пользователя -

    // "GeeksforGeeks" например

    cin.getline(ch,80);

      

    // печатает 4

    cout << a << endl;

      

    // Печать строки: это делает

    // не печатать строку

    cout << ch << endl;

      

    return 0;

}

Входные данные:

4
GeeksforGeeks

Выход:

4

В обоих приведенных выше кодах вывод не распечатывается должным образом. Причиной этому является занятый буфер. Символ «/ n» остается там в буфере и читается как следующий ввод.

Как это можно решить?

В случае C:

  1. Использование «while ((getchar ())! = '/ N'); ” : Ввод« while ((getchar ())! = '/ N'); »читает символы буфера до конца и отбрасывает их (включая символ новой строки) и использует их после того, как инструкция« scanf () »очищает входной буфер и позволяет вводить в нужный контейнер.

    // C код, объясняющий, почему добавление
    // "while ((getchar ())! = '/ n');"
    // после оператора "scanf ()"
    // очищает входной буфер
    #include<stdio.h>

      

    int main()

    {

        char str[80], ch;

          

        // сканировать ввод от пользователя -

        // GeeksforGeeks например

        scanf("%s", str);

          

        // сбрасывает стандартный ввод

        // (очищает входной буфер)

        while ((getchar()) != '\n');

          

        // сканируем символ от пользователя -

        // 'a' например

        ch = getchar();

          

        // Печать массива символов,

        // печатает «GeeksforGeeks»)

        printf("%s\n", str);

          

        // Печать символа a: It

        // на этот раз напечатаем 'a'

        printf("%c", ch);

      

        return 0;

    }

    Входные данные:

    GeeksforGeeks
    a
    

    Выход:

    GeeksforGeeks
    a
    
  1. Использование «fflush (stdin)» : ввод «fflush (stdin)» после оператора «scanf ()» также очищает входной буфер, но его использование исключается и называется «неопределенным» для входного потока согласно C ++ 11 стандартов.

В случае C ++:

  1. Использование «cin.ignore (numeric_limits :: max (), '/ n'); » : — Ввод« cin.ignore (numeric_limits :: max (), '/ n'); »после оператора« cin »отбрасывает все во входном потоке, включая символ новой строки.

    // C ++ код, чтобы объяснить, как
    // "cin.ignore (numeric_limits
    // <streamsize> :: max (), '/ n'); "
    // отбрасывает входной буфер
    #include<iostream>

      
    // для <streamsize>
    #include<ios>     

      
    // для numeric_limits
    #include<limits> 

    using namespace std;

      

    int main()

    {

        int a;

        char str[80];

          

        // Введите ввод от пользователя

        // - 4 например

        cin >> a;

          

        // отбрасывает входной буфер

        cin.ignore(numeric_limits<streamsize>::max(),'\n');

          

        // Получить ввод от пользователя -

        // GeeksforGeeks например

        cin.getline(str, 80);

          

        // печатает 4

        cout << a << endl;

          

        // Печать строки: это

        // сейчас напечатает строку

        cout << str << endl;

      

        return 0;

    }

    Входные данные:

    4
    GeeksforGeeks
    

    Выход:

    4
    GeeksforGeeks
    
  1. Использование «cin.sync ()»: ввод «cin.sync ()» после оператора «cin» отбрасывает все, что осталось в буфере. Хотя «cin.sync ()» работает не во всех реализациях (в соответствии со стандартами C ++ 11 и выше).

    // C ++ код, объясняющий, как "cin.sync ();"
    // отбрасывает входной буфер
    #include<iostream>
    #include<ios>     
    #include<limits> 

    using namespace std;

      

    int main()

    {

        int a;

        char str[80];

          

        // Введите ввод от пользователя

        // - 4 например

        cin >> a;

          

        // Сбрасывает входной буфер

        cin.sync();

          

        // Получить ввод от пользователя -

        // GeeksforGeeks например

        cin.getline(str, 80);

          

        // печатает 4

        cout << a << endl;

          

        // Печать строки - это

        // сейчас напечатает строку

        cout << str << endl;

      

        return 0;

    }

    Входные данные:

    4
    GeeksforGeeks
    

    Выход:

    4
    
  1. Использование «cin >> ws»: ввод «cin >> ws» после оператора «cin» указывает компилятору игнорировать буфер, а также отбрасывать все пробелы перед фактическим содержимым строки или символьного массива.

    // C ++ код, объясняющий, как "cin >> ws"
    // сбрасывает входной буфер вместе с
    // начальные пробелы строки

      
    #include<iostream>
    #include<vector> 

    using namespace std;

      

    int main()

    {

        int a;

        string s;

          

        // Введите ввод от пользователя -

        // 4 например

        cin >> a;

          

        // Сбрасывает входной буфер и

        // начальные пробелы строки

        cin >> ws;

          

        // Получить ввод от пользователя -

        // GeeksforGeeks например

        getline(cin, s);

          

        // печатает 4 и GeeksforGeeks:

        // выполнит print a и s

        cout << a << endl;

        cout << s << endl;

      

        return 0;

    }

    Входные данные:

    4
    GeeksforGeeks
    

    Выход:

    4
    GeeksforGeeks
    

Эта статья предоставлена Манджитом Сингхом . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Очистка входного буфера в C / C ++

0.00 (0%) 0 votes