为什么 std::getline 调用 std::cin 不等待用户输入?

发布于 2024-11-25 20:17:41 字数 139 浏览 0 评论 0原文

是否有任何充分的理由:

std::string input;
std::getline(std::cin, input);

getline 调用不会等待用户输入? cin的状态是不是有点混乱了?

Is there any good reason why:

std::string input;
std::getline(std::cin, input);

the getline call won't wait for user input? Is the state of cin messed up somehow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

微暖i 2024-12-02 20:17:41

您很可能在读取其他数据(例如 int)后尝试读取字符串。

考虑输入:

11
is a prime

如果您使用以下代码:

std::cin>>number;
std::getline(std::cin,input)

getline 将仅读取 11 之后的换行符,因此您会得到它不等待用户输入的印象。

解决此问题的方法是使用虚拟 getline 来消耗数字后面的新行。

Most likely you are trying to read a string after reading some other data, say an int.

consider the input:

11
is a prime

if you use the following code:

std::cin>>number;
std::getline(std::cin,input)

the getline will only read the newline after 11 and hence you will get the impression that it's not waiting for user input.

The way to resolve this is to use a dummy getline to consume the new line after the number.

水中月 2024-12-02 20:17:41

我已经测试了以下代码并且运行正常。

#include <iostream>
using namespace std;
int main()
{
    string  input;
    getline(cin, input);
    cout << "You input is: " << input << endl;
    return 0;
}

我猜想在你的程序中你的输入缓冲区中可能已经有一些东西了。

I have tested the following code and it worked ok.

#include <iostream>
using namespace std;
int main()
{
    string  input;
    getline(cin, input);
    cout << "You input is: " << input << endl;
    return 0;
}

I guess in your program that you might already have something in you input buffer.

﹏半生如梦愿梦如真 2024-12-02 20:17:41

此代码不起作用:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

确实起作用:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string x;
std::getline(std::cin,x);

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

This code does not work:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}

This does work:

#include <iostream>
#include <string>

int main()
{
int nr;
std::cout << "Number: ";
std::cin >> nr;

std::string x;
std::getline(std::cin,x);

std::string  input;
std::cout << "Write something: ";
getline(std::cin, input);
std::cout << "You input is: " << input << std::endl;

return 0;
}
因为看清所以看轻 2024-12-02 20:17:41

这发生在 std::getline(std::cin, input); 之前有换行符 (/n)。 getline 读取直到遇到 /n。因此,它将读取一个空字符串并返回 null,而不等待用户输入。

为了解决这个问题,我们使用虚拟 getline 或 cin.ignore(1, /n);

this occurred cause before std::getline(std::cin, input); there's newline char (/n). The getline reads until it encounters /n. Therefore it will read an empty string and return null without waiting for the users input.

To counter this we use an dummy getline, or cin.ignore(1, /n);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文