c ++:istringstream

时间:2013-03-03 21:14:41

标签: c++ parsing cin istream

我正在使用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循环遍历它们,该循环使用迭代器遍历向量。但是,为了取悦评论者,我已在上面修改了它。

1 个答案:

答案 0 :(得分:3)

如果输入功能失败,则在清除故障状态之前,流将不再允许提取。在您使用std::basic_ios::clear检查varValue的输入失败后,您需要执行此操作:

if(!(stringSplitter >> varValue)){
  stringSplitter.clear();
  stringSplitter >> varRight;
}

我目前不知道你在做什么/* not end of input */(希望你没有检查eof()!),但建议您这样做:

while (getline(cin, inputLine)) {
  // ...
}

这会在潜入循环之前检查线路输入是否成功。