我正在使用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没有返回第一个新行字符,因此程序再次挂起,等待用户第二次按Enter键。是否有任何解决方法或解决方案来解决这个问题,而不采用好的旧式C风格fgets(stdin, buffer, bufsize)
。
答案 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