📜  清除C / C++中的输入缓冲区

📅  最后修改于: 2021-05-25 18:23:04             🧑  作者: Mango

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


它如何影响编程?

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

在C编程的情况下

// C Code to explain why not 
// clearing the input buffer
// causes undesired outputs
#include
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
a

输出:

GeeksforGeeks

如果是C++

// C++ Code to explain why
// not clearing the input 
// buffer causes undesired
// outputs
#include
#include
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
      
    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
    a
    

    输出:

    GeeksforGeeks
    a
    
  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
    // ::max(),'\n');" 
    // discards the input buffer
    #include
      
    // for 
    #include     
      
    // for numeric_limits
    #include 
    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::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
    #include     
    #include 
    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
    #include 
    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++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”