gpt4 book ai didi

c++ - 使用 cin 验证输入

转载 作者:行者123 更新时间:2023-11-30 05:37:57 25 4
gpt4 key购买 nike

#include<iostream>
#include<limits>

int main()
{
int m;
std::cin >> m;
while (std::cin.fail() || m <= 0) {
std::cin.clear();
std::cin >> m;
}
return 0;
}

上面的代码应该提示输入,直到输入一个正整数。但即使在输入正整数后,它也会不断提示输入。例如,假设我的输入为

abc
c4
-3
1
2
.
.

所以原则上,当我输入 1 时,执行应该被转移到循环之外。但它一直提示输入,看起来像一个无限循环。

看了一会,修改为

cin >> m;
while (cin.fail() || m <= 0) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cin >> m;
}

根据需要,输入一个正数终止循环。我没明白。为什么新行字符卡在输入缓冲区中?假设我有这个

int a , b;
cin >> a;
cin >> b;

当我的输入是

1
2

它正确地将 a 设置为 1 并将 b 设置为 2,而不是设置 b\n。为什么两种情况下的行为不同?

最佳答案

并不是说有一个杂散的换行符,而是整个输入还在流中。

cin >> m 如果无法提取整数,则立即失败。
它不会读取下一个“单词”并查看它是否为整数,如果不是,则在该“单词”之后停止 - “读取指针”留在初始失败点。

ignore 向前跳到行尾并忽略到那一点的所有内容。

为了说明差异,此程序首先尝试将输入读取为 int,如果失败,则再次读取相同的输入作为 std::string 以供使用在错误信息中:

int main() {
int n = 0;
string s;
while (!(cin >> n))
{
cin.clear();
cin >> s;
cout << "That wasn't an int, it was " << s << endl;
}
cout << "This is an int: " << n << endl;
}

您使用 ignore 找到的解决方案几乎是“标准”解决方案。

关于c++ - 使用 cin 验证输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com