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

标签 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 返回,因此程序再次挂起,等待用户第二次按下回车键。如果不求助于良好的旧 C 风格 fgets(stdin, buffer, bufsize),是否有解决此问题的方法或解决方案。

最佳答案

这是迄今为止我找到的唯一解决方法。这是我自己的 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 预期的方式工作,它在按下第一个输入后返回。

关于c++ 如何修复 std::cin 错误或解决它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22104124/

相关文章:

c++ - 为什么 auto 不能用作模板类型参数?

c++ - 与列表初始化语法的自动分配混淆

c++ - 简单的输入/输出控制台应用程序,不按给定顺序打印问题(结构性)

c++ - cpp上的简单求和程序

c++ - C++ 中的 UTF-8 兼容性

c++ - 将值输出到不同大小的缓冲区

c++ - 如何设置与背景图片大小相对应的窗口大小?

c++ - 来自 WM_CHAR 的奇怪输入 - WinAPI

c++ - 如何检查两个集合是否不相交?

c++从用户输入返回字符串或字符