未输入任何输入时,C ++ getline不为空

时间:2017-11-08 16:07:41

标签: c++ cin getline istream

我是c ++的新手,仍然试图围绕输入/输出流的工作方式。

我目前正在尝试编写一个函数来确保用户输入一个int,并告诉他们输入是否为空或者是否为有效的int。

我正在使用getline,并尝试过使用cin.clear和cin.ignore,但我似乎无法让它工作,不知道我哪里出错了。

如果我输入一个字母就可以了,但如果我只输入没有任何输入的输入,它就不会说没有检测到输入。

void testStuff()
{
    string number;

    ws(cin);//skips Whitespaces

    if (getline(cin, number) && number.end() !=
        find_if_not(number.begin(), number.end(), &isdigit))
    {
        if (number.empty())
        {
            cout << "No input detected" << endl;
            testStuff();
        }
        cout << "Please input a Valid number" << endl;
        testStuff();
    }
}

2 个答案:

答案 0 :(得分:3)

假设您的ws按指定的方式工作(跳过输入中的空格),当您调用getline时,必须输入除空格之外的其他内容。因此,当调用getline时,非空白字符必须在输入缓冲区中等待,并且getline必须返回非空字符序列(即,从第一个非空白字符开始的所有内容)角色直到下一个新线。)

例如,让我们编写自己的ws,以显示它跳过的字符:

void ws(std::istream &is) {
    while (std::isspace(is.peek())) {
        char ch;
        is.get(ch);
        std::cout << "Read: " << (int)ch << '\n';
    }
}

现在,当我们拨打testStuff()并按输入时,我们会将Read: 10作为输出 - 即ws已阅读并跳过新的-line我们进入了。

因此,要接听getline的调用,用户输入除空格以外的内容,而换行符是空格。所以,但是根本调用时间getline,我们知道在输入缓冲区中有一些非空白字符等待,所以当调用getline时,必须产生非空结果。

答案 1 :(得分:1)

我假设我不知道实现的每个函数都是正确写入的。然后,我有这样的代码(简化):

#include <iostream>
#include <string>
using namespace std;

int main() {
    string number;
    if (getline(cin, number))
    {
        if (number.empty())
        {
            cout << "No input detected" << endl;
            main();
        }
        cout << "Please input a Valid number" << endl;
        main();
    }
}

我不知道find_if_not(number.begin(), number.end(), &isdigit)实施,所以我跳过它。我已将源代码放在Ideone.com上,您可以查看它HERE。通过“刚进入”后,程序表现得很好。这意味着,您未向我们展示的功能实现之一工作不正确。为了帮助您,我们需要完整的源代码(如果没有,只需要部分)。此外,您应该跳过“using namespace std;”。我认为,number.end() != find_if_not(number.begin(), number.end(), &isdigit))实施不正确。你应该考虑一下有人在评论中告诉你的内容 - “如果字符串为空,则find_if_not可以返回的唯一内容是number.end()。number.end()== number.end()并且不输入正文。”< / p>