【问题标题】:How can I clear the input buffer in a c++ application?如何清除 C++ 应用程序中的输入缓冲区?
【发布时间】:2011-08-14 05:21:29
【问题描述】:

我制作了很多简单的控制台 C++ 应用程序,我面临的一个问题是输入缓冲区。我尝试过 cin.ignore 和 flush(),但它们似乎对我不起作用。

如果我有如下代码:

cin >> char1;
cin >> char2; 

然后我按下:1(空格)2(回车),只需一次回车,1 存储到 char1,2 存储到 char2。

对不起,如果我对我的要求有点模糊。如果人们不明白,我会尝试编辑这个问题。

【问题讨论】:

  • 您希望存储1 而忽略2(和空格)吗?
  • 是的。我希望空格和 2 被忽略,因为它将数据存储到 char
  • @Ajay:你可以尝试输入字符串,然后只去掉第一个字符。
  • 我可以使用 string.at(#),但是整数和其他变量会变得混乱。不过感谢您的建议。
  • 其实我只是测试了一下,字符串以空格字符结尾,所以不起作用

标签: c++ input


【解决方案1】:

您可以使用getline 一次读取整行,如果需要第一个字符,则可以使用std::string at,如果需要第一个数字,请使用isstringstream

char char1;
std::string input;

getline(std::cin, input);
if (!std::cin.good()) {
  // could not read a line from stdin, handle this condition
}

std::istringstream is(input);
is >> char1;
if (!is.good()) {
  // input was empty or started with whitespace, handle that
}

如果您经常这样做,请将其包装在一个函数中。如上,如果您直接按回车键(不输入字符),或者如果您输入以空格开头的数据,is 将是!good(),因此char1设置。

或者,在您检查 cin 仍然很好之后,您可以简单地:

if (input.empty()) {
  // empty line entered, deal with this
}
char1 = input.at(0);

这样,如果字符串非空,char1 将被设置为第一个 char,如果 input,不管是什么(包括空格)。

请注意:

is >> char1;

只会读取第一个字符,而不是第一个数字(与input.at() 版本相同)。因此,如果输入是 123 qzechar1 将收到 '1'(如果是 ASCII 则为 0x31),而不是值 123。不确定这是否是您想要的。如果这不是您想要的,请读取 int 变量,然后正确转换。

【讨论】:

  • 好的,感谢您的所有意见。你们都非常有帮助和教育。我想我在这里有足够的方法来回答我的问题。我会在早上试试这些。
  • 它读取一行,并从中获取第一个char。就这样。如果该行为空,char1 将保持不变,因此您需要检查is.good()。如果该行只有空格,char1 也将保持不变,is.good() 将为 false。
  • 听起来像我需要的。谢谢,我现在将其标记为答案。
【解决方案2】:

看这个:

int a,b;
cin>>a;
cin.ignore(INT_MAX,'\n');
cin>>b;

这将读入并忽略所有内容,直到 '\n' 忽略一行

【讨论】:

    【解决方案3】:

    如果您只想要行中的第一个字符,请阅读整行然后将其拆分:

    std::string s;
    std::cin >> s;
    char1 = s[0]; // this reads the lead character
    

    如果您想要第一个非空白字符,请使用 istringstream 并抓取一个字符:

    #include <sstream>
    std::istringstream iss(s);
    iss >> char1;
    

    在 linux 上的“C”方式需要 termios,看起来像这样:

    #include <termios.h>
    
    struct termios t;
    tcgetattr(0, &t); 
    t.c_lflag &= ~ICANON; // unbuffered
    tcsetattr(0, TCSANOW, &t); // make the change now
    char1=getchar()
    char2=getchar()
    

    现在,如果您尝试输入“12”,则 char1 = '1' 和 char2='2'

    【讨论】:

    • 但这不会刷新输入缓冲区。它只是抓住了代码的第一个字符,这仍然是我的问题。
    • 您是否尝试在键入时捕获第一个字符?如果是这样,有一个使用 getchar 的 C 方法。
    • 我想要做的是从键盘获取输入,如果我输入:232 253 然后按回车,253 不会保留在输入缓冲区中。因为正在发生的事情是这样的空间导致文本的后半部分存储到下一个变量“cin”。注意:上面的 232 和 253 之间有一个空格。
    • 好的,感谢您的所有意见。你们都非常有帮助和教育。我想我在这里有足够的方法来回答我的问题。我会在早上试试这些。
    【解决方案4】:

    如果您正在使用 cstdio,那么:

    rewind( stdin );
    

    应该做的工作。否则,我认为您的问题已在 How do I flush the cin buffer? 中得到解答。

    【讨论】:

    • 好的,感谢您的所有意见。你们都非常有帮助和教育。我想我有足够的方法可以说我的问题得到了回答,我会在早上尝试这些方法。
    【解决方案5】:
    cin >> char1;
    
    cin >> char2;
    
    fflush(stdin);
    

    如果用户输入:aaaaa bbbbb ccccc

    它将输入aaaaa into char1

    然后输入bbbbb into char2

    其余的将被忽略

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2014-09-08
      • 1970-01-01
      相关资源
      最近更新 更多