没有输入时C ++ getline不为空

C++ getline is not empty when no input is entered

我是 c++ 的新手,仍在努力了解 input/output 流的工作原理。

我目前正在尝试编写一个函数来确保用户输入一个 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();
    }
}

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

#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。通过 "just enter" 后,程序正常运行。这意味着,您没有向我们展示的功能实现之一工作不正常。为了帮助您,我们需要完整的源代码(如果没有,只需要部分)。此外,您应该跳过 "using namespace std;"。我认为 number.end() != find_if_not(number.begin(), number.end(), &isdigit)) 实施不正确。你应该想想有人在评论中告诉你的话 - "If the string is empty the only thing find_if_not can return is number.end(). number.end() == number.end() and body is not entered."

假设您的 ws 按规定工作(跳过输入中的空格),到您调用 getline 时,必须输入空格以外的内容。因此,当 getline 被调用时,非空白字符必须在输入缓冲区中等待,并且 getline 必须 return 一个非空字符序列(即,来自下一个换行符之前的第一个非空白字符)。

例如,让我们编写自己的 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 有阅读并跳过我们输入的新行。

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