为什么std :: getline没有阻止?

时间:2012-07-06 02:04:29

标签: c++ objective-c macos objective-c++ getline

我在Objective-C类中使用此代码(在Objective-C ++文件中):

+(NSString *)readString
{
    string res;
    std::getline(cin, res);
    return [NSString stringWithCString:res.c_str() encoding:NSASCIIStringEncoding];
}

当我运行它时,我每次都得到一个零长度的字符串。从未有机会在命令行输入。没有。当我将这段代码逐字复制到main()时,它就可以了。我在Build Settings下有ARC。我不知道它发生了什么。 OSX 10.7.4,Xcode 4.3.2。

控制台应用程序。

2 个答案:

答案 0 :(得分:9)

这意味着有输入等待读取输入。您可以清空输入:

cin.ignore(std::numeric_limits<std::streamsize>::max();
std::getline(cin, res);

如果发生这种情况,则意味着您没有在先前的读取中读取输入流中的所有数据。上述代码会在尝试阅读更多内容之前删除任何用户输入。

这可能意味着您要将operator>>std::getline()混合以阅读用户输入。您可能应该选择一种技术并在整个应用程序中使用它(std :: getline())(您可以混合它们,您只需要更加小心并在使用运算符&gt;&gt;后删除'\ n'以确保任何后续std :: getline()不会混淆..

如果您想读取一个数字,请阅读该行,然后解析该行之外的数字:

std::getline(cin, line);
std::stringstream  linestream(line);

linestream >> value;

答案 1 :(得分:2)

您可以这样做:

cin.ignore();

或使用

cin.clear();
cin.sync();

在使用getline()

之前