奇怪的c ++输入转义和空间行为

时间:2010-06-19 19:43:56

标签: c++ console user-input

我的c ++示例遇到了令人不快的问题。一切正常,直到我输入一个空白的东西。

#include <iostream>
using namespace std;

int main (int argc, char * const argv[])
{
    int iteration = 0;
    while (true) {
        char * input = new char[256];
        scanf("%s", input);
        cout << ++iteration << ": " << input << endl;
        cin.get();
    }
    return 0;
}

所以使用这段代码,我可以输入任何内容,但是空白之后的所有内容都存储在缓冲区中并在第二次迭代中使用。

foo
1: foo
bar
2: bar
foobar
3: foobar
foo bar
4: foo
5: bar

每一个输入阅读功能都是这样的,它让我发疯。 cin >> inputfreads()cin.get()等都是这样做的。

这是用户输入的常见问题,还是我在这里做错了什么?

3 个答案:

答案 0 :(得分:4)

首先,永远不要使用scanf。很难使用该功能并避免缓冲区溢出。将input替换为std::string,并从std::cin读取。

scanf("%s", input)cin >> input都会读取一个由空格分隔的单词。如果您想阅读整行,请使用getline(cin, input)

答案 1 :(得分:1)

关于scanf %s format specifier

  

这将读取后续字符,直到找到空格(空白字符被视为空白,换行符和制表符)。

关于istream::operator>> with str parameter

  

当下一个字符是有效的空格或空字符,或者如果到达文件结尾时,提取结束。

所以是的,这是这些功能的标准行为。

答案 2 :(得分:1)

也许尝试使用std :: getline代替? http://www.cplusplus.com/reference/string/getline/