真正解决'cin'和'getline'问题

A real solution to the 'cin' and 'getline' issue

本文关键字:getline 问题 cin 解决      更新时间:2023-10-16

如何摆脱前导' '和'n'符号当我不确定我会得到一个cin,在getline之前?

的例子:

int a;
char s[1001];
if(rand() == 1){
    cin >> a;
}
cin.getline(s);

如果我在getline之前放一个cin.ignore(),我可能会失去字符串的第一个符号,所以我唯一的选择是把它放在每次使用'cin>>'之后吗?因为当你在做一个大项目时,这不是很有效的方法。

还有比这更好的方法吗?

int a;
string s;
if(rand() == 1){
    cin >> a;
}
do getline(cin, s); while(s == "");

像这样:

std::string line, maybe_an_int;
if (rand() == 1)
{
    if (!(std::getline(std::cin, maybe_an_int))
    {
        std::exit(EXIT_FAILURE);
    }
}
if (!(std::getline(std::cin, line))
{
    std::exit(EXIT_FAILURE);
}
int a = std::stoi(maybe_an_int);    // this may throw an exception

可以用几种不同的方法解析字符串maybe_an_int。您也可以使用std::strtol,或字符串流(在与第一个if块相同的条件下):

    std::istringstream iss(maybe_an_int);
    int a;
    if (!(iss >> a >> std::ws) || iss.get() != EOF)
    {
        std::exit(EXIT_FAILURE);
    }

当然,你可以更优雅地处理解析错误,例如,通过在循环中运行整个东西,直到用户输入有效的数据。

空格和换行符都被标准IOStreams分类为空白。如果您将格式化的I/O与未格式化的I/O混合在一起,并且需要清除剩余的空白流,请使用std::ws操纵符:

if (std::getline(std::cin >> std::ws, s) {
}