为什么必须键入 getline(cin,字符串)两次

Why must type getline(cin, string) twice?

本文关键字:cin 字符串 两次 getline 为什么      更新时间:2023-10-16

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

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

有没有比这更好的方法来获取用户输入,或者是否有任何其他代码可以键入而不是键入两次 getline?请指教。

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

if (std::getline(std::cin >> std::ws, mvName)) {
    process(mvName);
}

顺便说一句,您应该始终检查您的输入是否成功。

我在使用时没有问题:

char mvName[32];

cin.getline(mvName, 32);

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

也许您只是忘记在提示消息中添加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
....

由于问题不包含换行符,我怀疑您按回车键从"Enter movie name"问题向下移动?这会在stdin中放置一个空行,第一个getline()将读取,然后第二个getline()将读取您输入的文本。

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

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

工作正常!

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