首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xcode 4.4 Lion在C++中不一致的换行符行为,使用的是GCC与LLVM

Xcode 4.4 Lion在C++中不一致的换行符行为,使用的是GCC与LLVM
EN

Stack Overflow用户
提问于 2012-08-28 02:59:27
回答 1查看 371关注 0票数 2

多年来,我一直使用下面这段代码来使用从cin到下一个换行符的字符。

代码语言:javascript
运行
复制
void skip_rest_of_line()
{
    while (cin.get() != '\n') {}
}

我会在捕获异常并清除cin状态后调用它,如下所示:

代码语言:javascript
运行
复制
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++标准库),看起来在识别换行符方面有很多问题。与上面相同的代码需要第二次返回击键来满足循环!另一种方法也会出现同样的问题:

代码语言:javascript
运行
复制
cin.ignore(numeric_limits<streamsize>::max(), '\n');

最后,在while循环中使用getchar而不是cin.get()可以像往常一样工作!

这是libc++中的错误吗?还是我在Xcode或C++11中遗漏了什么?

作为对Howard Hinnant的回应,这里有一个小测试用例,它展示了图片中没有任何异常等情况发生的情况:

代码语言:javascript
运行
复制
#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++,当我输入这两行代码时,我得到了我期望的结果,每一行都以一个空格结尾,然后是一个回车键:

代码语言:javascript
运行
复制
1 2 3 4 5 
6 7 8 3 

然后我进入Xcode的输出窗口:

代码语言:javascript
运行
复制
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++,直到我在两个输入行之后输入第二次回车键之前,第一行不会发生任何变化,但是正确的丢弃仍然发生了。因此,每一个输入行后面的额外空格就是第二次击键的样子。

代码语言:javascript
运行
复制
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循环也会发生相同的行为。所以问题是“为什么需要第二次回车击键?”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-30 08:47:01

我认为这是一个错误,在libc++上的狮子,并固定在山狮。但是,如果没有完整的测试用例,很难确定。

更新

谢谢你的测试用例。确认了Lion上的错误,并修复了Mountain Lion上的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12147915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档