当没有输入任何输入时,C++getline不为空

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

本文关键字:输入 C++getline 任何      更新时间:2023-10-16

我是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();
}
}

假设您的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()并按下enter时,我们得到Read: 10作为我们的输出——即ws已经读取并跳过了我们输入的新行。

因此,为了调用getline,用户必须输入除空白之外的内容,而新行就是空白。所以,但在调用getline时,我们知道输入缓冲区中有一些非空白字符在等待,所以当调用getline时,它必须产生非空结果。

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

#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上,你可以在这里查看。通过"刚进入"后,程序就无效了。这意味着,您没有向我们展示的一个函数实现工作不正确。为了帮助您,我们需要完整的源代码(如果没有,只需要部分)。此外,您应该跳过"使用命名空间std;"。我认为number.end() != find_if_not(number.begin(), number.end(), &isdigit))执行错误。你应该想想有人在评论中告诉你的话——"如果字符串为空,find_If_not唯一能返回的就是number.end().number.end(()==number.end),并且没有输入正文。">