关于标准库:Xcode 4.4使用GCC与LLVM在C ++中使用Lion不一致的换行符

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,并且固定在了山狮上。但是如果没有一个完整的测试用例,就很难确定。

更新

谢谢你的测试用例。确认了狮子身上的虫子,并固定在山上的狮子身上。