我的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 >> input
,freads()
,cin.get()
等都是这样做的。
这是用户输入的常见问题,还是我在这里做错了什么?
答案 0 :(得分:4)
首先,永远不要使用scanf
。很难使用该功能并避免缓冲区溢出。将input
替换为std::string
,并从std::cin
读取。
scanf("%s", input)
和cin >> input
都会读取一个由空格分隔的单词。如果您想阅读整行,请使用getline(cin, input)
。
答案 1 :(得分:1)
这将读取后续字符,直到找到空格(空白字符被视为空白,换行符和制表符)。
关于istream::operator>>
with str parameter:
当下一个字符是有效的空格或空字符,或者如果到达文件结尾时,提取结束。
所以是的,这是这些功能的标准行为。
答案 2 :(得分:1)
也许尝试使用std :: getline代替? http://www.cplusplus.com/reference/string/getline/