c ++如何修复std :: cin bug或解决它

时间:2014-02-28 19:26:15

标签: c++ c++11 cin getline libc++

我正在使用Apple LLVM 3.0,显然std::getlinecin.getline存在错误,要求用户按两次输入才能使std::getline函数返回控件回到程序。以此示例代码为例:

int main(int argc, const char * argv[]) {
    using namespace std;

    string str;

    cout << "Enter some text: ";
    getline(cin, str);

    cout << "\nYou Entered: " << str;

    return 0;
}

结果:

Enter some text: hello world

我按回车一次,程序仍在运行并等待输入。我必须再次按Enter键才能让程序停止询问输入并继续执行。

我已经搜索了答案,这显然是libc ++中的一个错误,MS VC ++ 6.0中也存在类似的错误(我认为)。

我尝试使用cin.get(char)实现自己的getline函数并在遇到'\ n'或'\ r'字符时返回。以下是代码:

std::istream& getline(std::istream &in, std::string &str) {
    char ch;

    str.clear();

    while (in.get(ch) && ch != '\n' && ch != '\r') {
        str += ch;
    }

    return in;
}

不幸的是,我仍然遇到同样的问题,因为in.get没有返回第一个新行字符,因此程序再次挂起,等待用户第二次按Enter键。是否有任何解决方法或解决方案来解决这个问题,而不采用好的旧式C风格fgets(stdin, buffer, bufsize)

2 个答案:

答案 0 :(得分:1)

这是我到目前为止找到的唯一解决方法。这是我自己的getline版本:

std::istream& getline(std::istream &in, std::string &str) {
    char chr;
    std::ios_base::fmtflags flags = in.flags();

    str.clear();

    while ((in >> std::noskipws >> chr) && (chr != '\n') && (chr != '\r')) {
        str += chr;
    }

    in.flags(flags);
    return in;
}

上述函数的作用是std::getline,它会在第一次输入后返回。

答案 1 :(得分:1)

我刚尝试使用最新版本的Xcode和Apple的LLVM,但无法重现这一点。 (即,我只需要点击返回一次)

$ clang++ --version
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

我是这样构建的:

$ clang++ -stdlib=libc++ so.cpp