C++ 从用户读取整数
我正试图从终端读取一个整数。这是我的密码:C++ 从用户读取整数,c++,C++,我正试图从终端读取一个整数。这是我的密码: int readNumber() { int x; std::cin >> x; while(std::cin.fail()) { std::cin.clear(); std::cin.ignore(); std::cout << "Bad entry. Enter a NUMBER: "; std::cin >> x;
int readNumber()
{
int x;
std::cin >> x;
while(std::cin.fail())
{
std::cin.clear();
std::cin.ignore();
std::cout << "Bad entry. Enter a NUMBER: ";
std::cin >> x;
}
return x;
}
为什么它会多次写“坏条目”?
如果我删除std::cin.clear()代码>或标准::cin.ignore()代码>,程序只是一直在写
输入一个数字:输入错误。
有人能解释一下它为什么会这样做吗?这实际上是一个部分重复的数字,但它的措辞非常不同,因此我将在这里简要介绍它
如果没有这两行,您将获得无限打印,因为需要清除cin.clear()
以清除cin.fail()
正在读取的错误标志。有关详细信息,请参见链接问题
为什么在有这些行的情况下,它还会打印多次?当你做std::cin>>x代码>,代码将读取输入中的第一个字符,并尝试将其解析为int
。它将失败,然后在循环的下一次迭代中,它将尝试解析下一个字符并再次失败。对于每次失败(即输入中的每个字符),它将打印错误条目。输入一个数字:
。如果你用更少的字符输入一些错误的输入,你就会明白我的意思
有多种方法可以解决此问题,但一种简单的解决方法是将整个输入读取到字符串中,并尝试对其进行解析,而不是使用cin
直接将其转换为int
。下面是一些示例代码,需要使用C++11
的各种方法之一进行编译。我已经用你的输入对它进行了测试,它似乎达到了你想要的效果
#include <iostream>
#include <string>
#include <stdexcept>
bool tryParse(std::string& input, int& output) {
try{
output = std::stoi(input);
} catch (std::invalid_argument) {
return false;
}
return true;
}
int main(){
std::string input;
int x;
getline(std::cin, input);
while (!tryParse(input, x))
{
std::cout << "Bad entry. Enter a NUMBER: ";
getline(std::cin, input);
}
return x;
}
#包括
#包括
#包括
booltryparse(标准::字符串和输入、int和输出){
试一试{
输出=标准::stoi(输入);
}catch(std::无效的_参数){
返回false;
}
返回true;
}
int main(){
std::字符串输入;
int x;
getline(标准::cin,输入);
而(!tryParse(输入,x))
{
std::coutcin.fail()
如果最后一个cin命令失败,则返回true,否则返回false
请尝试以下方法:
while(1)
{
std::cin >> x;
if (!std::cin.fail()) break;
std::cin.clear();
std::cin.ignore(10000,'\n');
std::cout << "Bad entry. Enter a NUMBER: ";
}
while(1)
{
标准:cin>>x;
如果(!std::cin.fail())中断;
std::cin.clear();
标准::cin.ignore(10000,“\n”);
std::cout无论如何尝试一下……因为我直接在stackoverflow中键入它可能会有编译错误
int readNumber()
{
int x=0;
while(true)
{
std::cin >> x;
if(!std::cin.fail()){
break;
}
else{
std::cout << "Bad entry. Enter a NUMBER: " << std::endl;
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
}
}
}
int readNumber()
{
int x=0;
while(true)
{
标准:cin>>x;
如果(!std::cin.fail()){
打破
}
否则{
std::coutint main(){
字符*输入;
std::cin>>输入;
INTX=std::atoi(输入);
而(x==0&&strcmp(输入,“0”)!=0){
std::cout>输入;
x=std::atoi(输入);
}
返回x;
}
请注意,当您有3个非int字符时,它将重复3次,当您有5个时,它将重复5次。
这是因为cin尝试第一个字符,失败,尝试第二个字符,失败等等,直到你的所有输入字符都被解析。尝试在你的while循环中添加一个中断。应该解决你的问题没有帮助。我在if(cin>>x)My bad中添加了一个中断。很累,但无论如何添加了一个正确的答案,应该可以工作。(: Cheers@user2975699,简短的回答是,您在每个字符上都失败了,并且为每个失败打印了错误消息。@merlin2011,我也这么认为,但是有4个字符,但错误消息出现了6次。
int readNumber()
{
int x=0;
while(true)
{
std::cin >> x;
if(!std::cin.fail()){
break;
}
else{
std::cout << "Bad entry. Enter a NUMBER: " << std::endl;
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
}
}
}
int main() {
char* input;
std::cin >> input;
int x = std::atoi(input);
while(x == 0 && strcmp(input, "0") != 0) {
std::cout << "Bad entry. Enter a NUMBER: ";
std::cin >> input;
x = std::atoi(input);
}
return x;
}