多年来,我一直使用下面这段代码来使用从cin到下一个换行符的字符。
void skip_rest_of_line()
{
while (cin.get() != '\n') {}
}
我会在捕获异常并清除cin状态后调用它,如下所示:
catch (Error& error) {
cout << error.msg << endl;
cin.clear();
skip_rest_of_line();
}
下一次从cin读取时,将跳过剩余的换行符作为空格。
我刚刚在Lion下切换到了Xcode4.4.1。使用LLVMGNU4.2 GNU++98,libstdc++(GNU C++标准库),它像往常一样工作。
但是使用Apple LLVM Compiler4.0,c++11,libc++ (支持C++11的LLVM C++标准库),看起来在识别换行符方面有很多问题。与上面相同的代码需要第二次返回击键来满足循环!另一种方法也会出现同样的问题:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
最后,在while循环中使用getchar而不是cin.get()可以像往常一样工作!
这是libc++中的错误吗?还是我在Xcode或C++11中遗漏了什么?
作为对Howard Hinnant的回应,这里有一个小测试用例,它展示了图片中没有任何异常等情况发生的情况:
#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() != '\n') {}
break;
}
}
for(auto it = v.begin(); it != v.end(); ++it)
cout << *it << ' ';
cout << endl;
}
cout << "done" << endl;
return 0;
}
它读取并保存整数,直到将其保存为3,然后通过下一个换行符读取并丢弃,然后重复整个操作,因此您可以看到3之后的内容从输入流中被丢弃。使用Xcode4.4.1 Lion With GNU++98 || GNU++11,libstd++,当我输入这两行代码时,我得到了我期望的结果,每一行都以一个空格结尾,然后是一个回车键:
1 2 3 4 5
6 7 8 3
然后我进入Xcode的输出窗口:
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,libc++,直到我在两个输入行之后输入第二次回车键之前,第一行不会发生任何变化,但是正确的丢弃仍然发生了。因此,每一个输入行后面的额外空格就是第二次击键的样子。
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循环也会发生相同的行为。所以问题是“为什么需要第二次回车击键?”
发布于 2012-08-30 08:47:01
我认为这是一个错误,在libc++上的狮子,并固定在山狮。但是,如果没有完整的测试用例,很难确定。
更新
谢谢你的测试用例。确认了Lion上的错误,并修复了Mountain Lion上的错误。
https://stackoverflow.com/questions/12147915
复制相似问题