while循环中的C++ STD CIN错误
为什么当我进入下面的循环并在第一条指令中键入某些内容时 cmdstd:getlinestd::cin,cmdInput;不读取输入的内容。例如,如果我输入了b8,它应该显示cmd是b8,但它会跳到下一个读取std::getlinestd::cin,input;并显示为bwhile循环中的C++ STD CIN错误,c++,std,cin,while-loop,C++,Std,Cin,While Loop,为什么当我进入下面的循环并在第一条指令中键入某些内容时 cmdstd:getlinestd::cin,cmdInput;不读取输入的内容。例如,如果我输入了b8,它应该显示cmd是b8,但它会跳到下一个读取std::getlinestd::cin,input;并显示为b while (editingMode == TRUE) { std::getline(std::cin, cmdInput); istringstream cmdiss(cmdInput); cout
while (editingMode == TRUE) {
std::getline(std::cin, cmdInput);
istringstream cmdiss(cmdInput);
cout << "you entered: " << cmdInput <<endl;
if (cmdInput != "") {
copy(istream_iterator<string>(cmdiss),
istream_iterator<string>(),
back_inserter<vector<string> >(tokens));
std::cout << "cmd is " <<tokens.at(0) << std::endl;
}
//*************************
std::getline(std::cin, input);
istringstream iss(input);
if(input != ""){
copy(istream_iterator<string>(iss),
istream_iterator<string>(),
back_inserter<vector<string> >(tokens));
std::cout << "it is " << tokens.at(0) <<std::endl;
createInstruction(tokens);
}
你确定editingMode是真的吗?你确定editingMode是真的吗?代码没有问题。它只是没有做你认为应该做的事情:如果你想打印输入的整行而不是第一个单词,不要打印令牌[0];打印输入行 这两个部分的作用相同: 将一行读入字符串 从该行创建一个istream 将该istream中的单词读入一个名为“tokens”的字符串数组 打印第一个单词
显然,tokens.at0是第一个单词。如果要查找8之类的参数,请检查tokens.size或迭代tokens。代码没有问题。它只是没有做你认为应该做的事情:如果你想打印输入的整行而不是第一个单词,不要打印令牌[0];打印输入行 这两个部分的作用相同: 将一行读入字符串 从该行创建一个istream 将该istream中的单词读入一个名为“tokens”的字符串数组 打印第一个单词
显然,tokens.at0是第一个单词。如果要查找8之类的参数,请检查tokens.size或遍历tokens。也许输入缓冲区中有一个换行符,来自以前的输入?这是一个常见的错误 假设您的程序首先读取带有cin>>x的整数,然后读取带有getlinecin、cmdline的行。用户键入一个整数,后跟ENTER键。cin>>x将读取整数,但ENTER键(解释为换行符)将留在输入缓冲区中
然后,当您的程序继续使用getlinecin、cmdline读取完整的一行时,它将读取仅由剩余的换行符组成的非常短的一行。这看起来像是程序跳转到下一次读取。也许您在输入缓冲区中保留了一个换行符,来自先前的输入?这是一个常见的错误 假设您的程序首先读取带有cin>>x的整数,然后读取带有getlinecin、cmdline的行。用户键入一个整数,后跟ENTER键。cin>>x将读取整数,但ENTER键(解释为换行符)将留在输入缓冲区中 然后,当您的程序继续使用getlinecin、cmdline读取完整的一行时,它将读取仅由剩余的换行符组成的非常短的一行。这看起来像是程序跳转到下一次读取。问题是将>>提取与getline混合,在缓冲区中留下换行符或其他输入。盲目使用ignore将隐藏逻辑错误,例如输入42 abc,然后输入cin>>某些int;忽略。。。;。您真正需要做的是提取空白行:
int main() {
using namespace std;
int n;
string s;
cout << "Enter a number: "
cin >> n >> blankline; // <---
if (cin) {
cout << "Enter a line of text: ";
getline(cin, s);
}
if (!cin) {
clog << "Sorry, I can't do that.\n";
return 1;
else {
cout << "Input successful, now processing values: " << n << s << '\n';
}
return 0;
}
谢天谢地,这是:
问题是将>>提取与getline混合,在缓冲区中留下换行符或其他输入。盲目使用ignore将隐藏逻辑错误,例如输入42 abc,然后输入cin>>某些int;忽略。。。;。您真正需要做的是提取空白行:
int main() {
using namespace std;
int n;
string s;
cout << "Enter a number: "
cin >> n >> blankline; // <---
if (cin) {
cout << "Enter a line of text: ";
getline(cin, s);
}
if (!cin) {
clog << "Sorry, I can't do that.\n";
return 1;
else {
cout << "Input successful, now processing values: " << n << s << '\n';
}
return 0;
}
谢天谢地,这是:
很可能这就是问题所在。有关清除输入的信息,请参阅。我建议采用类似马丁·约克(Martin York)的回应,因为当它到达第一条新线时就会停止。很可能这就是问题所在。有关清除输入的信息,请参阅。我建议类似马丁·约克的回答,因为当它到达第一条新线时就会停止。