我正在使用c ++创建一个简单的命令解析器,我正在尝试使用istream>>检查我是否输入了数字或字符。
输入:
a = 10
b = a
parser.cpp:
string inputLine, varLeft, equal, varRight;
double varValue
// please see update below
while(getline(cin, inputLine)){
istringstream stringSplitter(inputLine);
stringSplitter >> varLeft >> equal;
if(!(stringSplitter >> varValue)){
stringSplitter >> varRight;
}
}
目标是,在代码的后面,如果varRight为空,我假设输入行是double
字面值,否则,它是一个表示变量的字符串。我理解可能存在与以数字开头的混合输入相关的逻辑错误,但我假设现在所有输入都已正确格式化。为什么第二行输入中的a
被丢弃?你有什么建议吗?
更新
问题不在于while循环语句,而在while代码块的末尾是if语句。
在实际代码中,循环实际上不是while循环;我正在使用一个包含字符串命令的向量对象,并使用for循环遍历它们,该循环使用迭代器遍历向量。但是,为了取悦评论者,我已在上面修改了它。
答案 0 :(得分:3)
如果输入功能失败,则在清除故障状态之前,流将不再允许提取。在您使用std::basic_ios::clear
检查varValue
的输入失败后,您需要执行此操作:
if(!(stringSplitter >> varValue)){
stringSplitter.clear();
stringSplitter >> varRight;
}
我目前不知道你在做什么/* not end of input */
(希望你没有检查eof()
!),但建议您这样做:
while (getline(cin, inputLine)) {
// ...
}
这会在潜入循环之前检查线路输入是否成功。