为什么当我进入下面的循环并输入第一条指令时 cmdstd:函数getline(标准:: CIN,cmdInput);不读取输入的输入。例如,如果我输入“b 8”,它应显示“cmd is b 8”,但它会跳到下一个读取std :: getline(std :: cin,input);并显示“它是b”而不是
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);
}
答案 0 :(得分:3)
也许你在输入缓冲区中留下了换行符,来自之前的输入?这是一个常见的错误。
让我们说你的程序首先用 cin&gt;&gt;读取一个整数。 x ,然后是 getline(cin,cmdline)的行。用户键入一个整数,然后按ENTER键。 cin&gt;&gt; x 将读取整数,但解释为换行符的ENTER键将保留在输入缓冲区中。
当你的程序继续读取带有 getline(cin,cmdline)的完整一行时,它将读取由该左上线换行符组成的非常短的行。这看起来像程序“跳到下一个读取”。
答案 1 :(得分:1)
代码没有问题。它只是没有你认为应该做的:)如果你想打印输入的整行而不是第一个单词,不要打印标记[0];打印输入行。
两个部分都做同样的事情:
tokens.at(0)是第一个单词。如果你想查找像“8”这样的参数,请检查tokens.size()或迭代标记。
答案 2 :(得分:0)
你确定editingMode是真的吗?
答案 3 :(得分:0)
问题是将>>
提取与getline混合,在缓冲区中留下换行符(或其他输入)。盲目地使用忽略将隐藏逻辑错误,例如输入"42 abc"
后跟cin >> some_int; cin.ignore(...);
。你真正需要做的是“提取”空行:
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;
}
谢天谢地,这是easy:
template<class C, class T>
std::basic_istream<C,T>&
blankline(std::basic_istream<C,T>& s,
typename std::basic_istream<C,T>::char_type delim) {
if (s) {
typename std::basic_istream<C,T>::char_type input;
if (!s.get(input) && s.eof()) {
s.clear(s.eofbit);
}
else if (input != delim) {
s.putback(input);
s.setstate(s.failbit);
}
}
return s;
}
template<class C, class T>
std::basic_istream<C,T>& blankline(std::basic_istream<C,T>& s) {
blankline(s, s.widen('\n'));
return s;
}