为什么必须两次输入getline(cin,string)?

时间:2012-10-04 08:44:27

标签: c++ user-input iostream

需要您的帮助才能获得用户输入 我希望用户键入一个包含空格的字符串。 我不能使用cin>>variable因为它们之间的空间使问题出错。 如果我使用getline(cin,string_variable)它可以正常工作。但我需要输入两次才能使其正常工作。

cout<<"Enter movie name";
getline(cin, mvName);
getline(cin, mvName);

有没有比这更好的获取用户输入的方法,还是有任何其他代码可以输入而不是两次输入getline?请咨询。

5 个答案:

答案 0 :(得分:6)

使用in >> value和未格式化的输入在格式化输入之间切换时,例如,使用std::getline(in, value),您需要确保已经消耗了任何您不感兴趣的空格。在您的情况下,可能存在来自先前输入的缓冲区中的换行符。假设你对领导空白感兴趣,最简单的方法是使用这样的东西:

if (std::getline(std::cin >> std::ws, mvName)) {
    process(mvName);
}
顺便说一下,你应该经常检查输入是否成功。

答案 1 :(得分:2)

我没有遇到任何问题:

char mvName[32];

cin.getline(mvName, 32);

我只需要打电话一次,没有任何问题。

答案 2 :(得分:1)

也许您忘记在提示消息中添加\n

cout<<"Enter movie name:\n";

但如果你想跳过空行 - 请执行以下操作:

// skip empty lines
while (cin >> mvName && mvName.empty());
// here mvName contains non empty string or it is empty because of error in reading
....

答案 3 :(得分:1)

由于问题不包含新行字符,我怀疑你是否按下了"Enter movie name"问题?这会在stdin中添加一个空行,第一个getline()会读取,然后第二个getline()会读取您输入的文字。

要删除键入初始换行符的要求,只需将其添加到问题的字符串文字中:

std::cout<< "Enter movie name:\n";

答案 4 :(得分:0)

cout<<"Enter movie name";
  getline(cin, mvName);

工作正常!

也许你必须两次使用getline(cin, mvName);,因为你在第一个getline(cin, mvName);中输入了一些字符,如Space,Enter等。