我正在使用 Apple LLVM 3.0,显然 std::getline
和 cin.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/