【问题标题】:How do you flush the contents of `std::cin` before an additional read from it?在额外读取之前如何刷新`std::cin`的内容?
【发布时间】:2015-10-01 19:50:31
【问题描述】:

我正在尝试读取单个字符多次。问题是我需要防止用户错误。比如:

char arr[10];
for(int i = 0; i < 10; i++)
{
    cin.get(arr[i]);
} 

输入应该类似于a, b, c, d, ...。但是,如果有人要输入ab 作为第一个条目,我想捕获a,然后忽略b。我知道cin.ignore,但是我不知道如何忽略任意数量的字母数字字符或符号,因为我想忽略可能无限数量的字符,然后停止忽略并再次阅读。

我怎样才能忽略任意数量的字符然后停止忽略 我怎样才能真正为 cin 刷新缓冲区。

【问题讨论】:

  • 这听起来不是很像How do I flush the cin buffer? 吗?
  • @BoPersson 引用了cin.ignore的使用
  • 您可能误解了来自cin 的输入是如何工作的。您如何区分用户输入了 2 个符号而不是 1 个?

标签: c++ iostream cin


【解决方案1】:

大多数输入是换行,所以如果你想忽略输入流中的所有字符,直到你点击换行符,那么你可以使用:

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

由于我们忽略了streamsize,因此输入缓冲区中不应有额外的内容。

【讨论】:

  • 所以这会被忽略,直到有人点击进入?
  • @NickChapman 这将忽略缓冲区中的所有字符,直到遇到换行符。
  • @Nick - 如果您认为应该再给输入一次机会,一个选项是先忽略 ',' 而不是 '\n'
【解决方案2】:

如果您希望用户在每个符号后按回车键,那么代码可以像这样简单:

char arr[10];
for(int i = 0; i < 10; )
{
    std::string line;
    std::getline( std::cin, line );
    // check that line is not empty
    if( line.empty() ) {
         std::cout << "missing input" << std::endl;
         continue;
    }
    arr[i++] = line[0]; // get only first symbol and ignore the rest
} 

如果您有其他想法,恐怕这不适用于std::cin - 在用户按下回车之前您看不到任何输入。在这种情况下,您将不得不使用特定于操作系统的函数来获得无缓冲的输入。

【讨论】:

    【解决方案3】:

    下面是你想要的代码,如果你像这样输入a 'enter' b 'enter' c 'enter' etc...

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
    
    
        char arr[10];
        string line;
    
        for (int i = 0; i < 10; i++)
        {
            getline(cin, line);
            arr[i] = line[0];
    
            cout << endl << "Here is the Char: " << arr[i] << endl;
        }
    
    
    
        return 0;
    }
    

    但是如果您在一行中输入这样的输入:a,b,c,d,e,f,g,h,i,j 'enter',那么您需要以下代码:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
    
    
        char arr[10];
        string line;
        int i = 0;
        size_t  end;
    
    
    
            getline(cin, line);
    
            end = 0;
            int counter = 0;
    
    
    
                if (line != "") {
    
                    while (end != string::npos && counter < 10) {
    
                        if (counter == 0) {
                            arr[counter] = line[0];
                        }
                        else {
                            end = line.find(",", end + 1);
                            arr[counter] = line[end + 1];
                        }
    
                        counter++;
    
                    }
                }
    
    
                for (int i = 0; i < 10; i++) {
                cout << endl << "Here is the Char: " << arr[i] << endl;
            }
    
    
    
    
    
    
    
        return 0;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2015-05-04
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 2016-03-20
      • 2020-12-12
      • 2010-11-27
      相关资源
      最近更新 更多