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