什么是缓冲区?
临时存储区域称为缓冲区。所有标准输入和输出设备都包含输入和输出缓冲区。在标准的C / C ++中,流是缓冲的,例如在标准输入的情况下,当我们按下键盘上的键时,它不会被发送到您的程序,而是由操作系统缓冲,直到分配给它为止。程序。


它如何影响编程?

在各种情况下,您可能需要清除不需要的缓冲区,以便在所需容器中获取下一个输入,而不是在先前变量的缓冲区中。例如,在遇到“scanf()”之后的C情况下,如果我们需要输入字符数组或字符,而在C ++的情况下,遇到“cin”语句后,我们需要输入字符数组或字符串,我们需要清除输入缓冲区,否则所需的输入被前一个变量的缓冲区占用,而不是由所需的容器占用。在第一次输入后按输出屏幕上的“Enter”(回车),因为前一个变量的缓冲区是新容器的空间(因为我们没有清除),程序跳过以下容器输入。

在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;
}

输入:

GeeksforGeeks
一个

输出:

GeeksforGeeks

在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;
}

输入:

4
GeeksforGeeks

输出:

4

在上述两个代码中,输出未按要求打印。原因是占用缓冲区。“\ n”字符在缓冲区中保留,并作为下一个输入读取。

怎么解决?

在C的情况下:

  1. 使用“while((getchar())!='\ n'); “:键入”while((getchar())!='\ n');“读取缓冲区字符直到结束并丢弃它们(包括换行符)并在”scanf()“语句清除输入缓冲区后使用它允许在所需容器中输入。
    // 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;
    }

    输入:

    GeeksforGeeks
    一个
    

    输出:

    GeeksforGeeks
    一个
    
  1. 使用“fflush(stdin)”:在“scanf()”语句之后键入“fflush(stdin)”也清除输入缓冲区但是避免使用它,并且根据C ++称为输入流的“未定义” 11个标准。

在C ++的情况下:

  1. 使用“cin.ignore(numeric_limits :: max(),'\ n'); “: - 键入”cin.ignore(numeric_limits :: max(),'\ n');“在”cin“语句之后丢弃输入流中的所有内容,包括换行符。
    // 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;
    }

    输入:

    4
    GeeksforGeeks
    

    输出:

    4
    GeeksforGeeks
    
  1. 使用“cin.sync()”:在“cin”语句后键入“cin.sync()”会丢弃缓冲区中剩余的所有内容。虽然“cin.sync()” 在所有实现中都不起作用(根据C ++ 11及更高标准)。
    // 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;
    }

    输入:

    4
    GeeksforGeeks
    

    输出:

    4
    
  1. 使用“cin >> ws”:在“cin”语句后输入“cin >> ws”告诉编译器忽略缓冲区,并在字符串或字符数组的实际内容之前丢弃所有空格。
    // 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
        // intial 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;
    }

    输入:

    4
    GeeksforGeeks
    

    输出:

    4
    GeeksforGeeks
    
在C / C ++中清除输入缓冲区-IDC帮帮忙