Xcode 4.4 Lion inconsistent newline behavior in C++ with GCC vs LLVM
多年来,我一直在使用下面的代码来使用从CIN到下一行(包括下一行)的字符。
1 2 3 4 5 | void skip_rest_of_line() { while (cin.get() != ' ') {} } |
在捕获异常并清除CIN状态后,我将调用此函数,如:
1 2 3 4 5 | catch (Error& error) { cout << error.msg << endl; cin.clear(); skip_rest_of_line(); } |
从CIN的下一次读取将剩余的新行跳转为空白。
我刚改成狮子下的XCOD4.4.1。使用LLVM GCC 4.2 GNU++ 98,LIbSTDC++(GNU C++标准库),它像以前一样工作。
但是使用Apple LLVM编译器4、C++ 11、LBC+ +(LVVM C++标准库和C++ 11支持),看起来有很多问题需要识别新行。与上面相同的代码需要第二次返回击键来满足循环!同样的问题也出现在备选方案中:
1 2 | cin.ignore(numeric_limits<streamsize>::max(), ' '); |
最后,在while循环中使用getchar而不是cin.get()可以像往常一样工作!
这是libc++中的错误吗?或者我错过了什么东西,无论是在XCODE还是C++ 11?
作为对霍华德·欣南特的回应,这里有一个小测试案例,展示了在图片中没有任何异常的情况下发生的事情,等等:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <iostream> #include <vector> using namespace std; int main() { for(int count = 0; count < 2; count++) { cout <<"ready for input:" << endl; int i; vector<int> v; while(cin >> i) { v.push_back(i); if(i == 3) { while(cin.get() != ' ') {} break; } } for(auto it = v.begin(); it != v.end(); ++it) cout << *it << ' '; cout << endl; } cout <<"done" << endl; return 0; |
}
它读取并保存int,直到它保存了一个3,然后在下一行中读取并丢弃,然后重复整个过程,这样您就可以看到3之后的内容从输入流中被丢弃。使用xcode 4.4.1 lion和gnu++98 gnu++11,libstd++,当我放入这两行,每行以一个空格结尾,然后按返回键时,我得到了我所期望的结果:
1 2 | 1 2 3 4 5 6 7 8 3 |
我进入xcode的输出窗口:
1 2 3 4 5 6 7 | ready for input: 1 2 3 4 5 1 2 3 ready for input: 6 7 8 3 6 7 8 3 done |
但是用C++ 11,LBC+++,在输入第二行回击键之前,没有任何事情发生,直到两行输入之后,但是正确的丢弃仍然发生。所以在每个输入行之后,下面的额外空间就是第二次击键的样子。
1 2 3 4 5 6 7 8 9 | ready for input: 1 2 3 4 5 1 2 3 ready for input: 6 7 8 3 6 7 8 3 done |
使用上面的cin.ignore调用而不是cin.get()周围的while循环时,会发生相同的行为。所以问题是"为什么需要第二次返回击键?"
我认为这是libc++中关于狮子的一个bug,并且固定在了山狮上。但是如果没有一个完整的测试用例,就很难确定。
更新
谢谢你的测试用例。确认了狮子身上的虫子,并固定在山上的狮子身上。