std::getline on std::cin

问题描述 投票:0回答:4

有什么充分的理由吗:

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

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

c++ getline cin
4个回答
7
投票

您很可能在读取其他数据后尝试读取字符串,例如

int

考虑输入:

11
is a prime

如果您使用以下代码:

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

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

解决这个问题的方法是使用一个虚拟的

getline
来消耗数字后面的新行。


1
投票

我已经测试了以下代码,它工作正常。

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

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


1
投票

此代码不起作用:

#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;
}

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.