2

我正在使用 c++ 创建一个简单的命令解析器,并且我正在尝试使用 istream >> 检查我输入的是数字还是字符。

输入:

a = 10
b = a

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

4

1 回答 1

3

如果输入函数失败,则在您清除失败状态之前,流将不再允许提取。varValue在检查输入失败后,您需要这样做std::basic_ios::clear

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

我不知道您目前/* not end of input */的情况如何(希望您没有检查eof()!),但建议您这样做:

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

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

于 2013-03-03T21:18:13.867 回答