2013-03-03 39 views
2

我正在创建一个简单的命令解析器使用c + +,我试图用istream >>来检查我是否输入一个数字或字符。C++:istringstream

输入:

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循环语句,它是在同时代码块结束的if语句。

在实际的代码中,循环实际上并不是一个while循环;我正在使用一个包含字符串命令的矢量对象,并使用一个使用迭代器遍历矢量的for循环遍历它们。但是,为了取悦评论者,我已经将其固定在上面。

回答

3

如果输入函数失败,则流将不允许进行任何更多的提取,直到您清除失败状态为止。你需要做的是,你已经检查后,输入到varValue失败,与std::basic_ios::clear

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

我不知道你是如何在此刻做/* not end of input */(希望你不是检查eof()),但建议您这样做:

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

此检查线路输入成功潜入循环之前。

+0

这完美地工作。关于while循环,请参阅上面的更新。非常感谢您的帮助。 – naxchange 2013-03-03 21:22:46

+0

但他怎么检查'stringSplitter >> varRight;'成功了吗? – 0x499602D2 2014-01-19 16:58:44