我一直在使用StanfordCPPLib来完成Eric S. Roberts的“C ++编程抽象”,但simpio.h中的这个功能突然让我感到悲伤。它在过去运作良好,但现在它无论我输入的是什么数字/字母/等,它都会给我“非法整数格式。再试一次。”
我通过从if语句中删除!stream.fail()位来尝试一些调试,它就像一个魅力......但是使用这个函数的一部分原因是检查失败状态。嗯。
自从最后使用这个库以来我唯一能记得做的就是从10.8升级到OSX 10.9
我错过了什么?提前谢谢!
/*
* Implementation notes: getInteger, getReal
* -----------------------------------------
* Each of these functions reads a complete input line and then uses the
* <sstream> library to parse that line into a value of the desired type.
* If that fails, the implementation asks the user for a new value.
*/
int getInteger(string prompt) {
int value;
string line;
while (true) {
cout << prompt;
getline(cin, line);
istringstream stream(line);
stream >> value >> ws;
if (!stream.fail() && stream.eof()) break;
cout << "Illegal integer format. Try again." << endl;
if (prompt == "") prompt = "Enter an integer: ";
}
return value;
}
答案 0 :(得分:1)
考虑"123"
提取的字符串getline
,然后将其放入istringstream
。
stream >> value
将提取123
,并在流上设置eofbit
。
然后stream >> ws
发生了。指定ws
首先构造一个sentry
对象,如果is.setstate(failbit)
为is.good()
,则指定其构造函数调用false
- 它是{{1}已设置。因此,eofbit
为stream.fail()
,true
为!stream.fail() && stream.eof()
,您的代码会打印&#34;非法整数格式&#34;。
false
,这似乎是不合格的。
一个简单的解决方法是在failbit
:
line
这可确保始终在未设置 istringstream stream(line + " ");
的情况下调用ws
,以便eofbit
的构造函数不会设置sentry
。