我正在尝试从终端读取整数。这是我的代码:
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;
}
每当我运行此代码时,我得到:
Type in the number for the newsgroup that shall be deleted:
joöä
Bad entry. Enter a NUMBER: Bad entry. Enter a NUMBER: Bad entry. Enter a NUMBER: Bad entry. Enter a NUMBER: Bad entry. Enter a NUMBER: Bad entry. Enter a NUMBER: 8
为什么会写错误的条目&#34;多次?
如果我删除std::cin.clear();
或std::cin.ignore();
,程序就会继续写
Enter a NUMBER: Bad entry.
任何人都可以解释为什么会这样做吗?
答案 0 :(得分:2)
这实际上是old question的部分重复,但其措辞不同,我将在此简要介绍。
cin.clear()
需要清除cin.fail()
正在读取的错误标记。有关详细信息,请参阅链接的问题。std::cin >> x;
时,您的代码将读取输入中的第一个字符,并尝试将其解析为int
。它将失败,然后在循环的下一次迭代中,它将尝试解析下一个字符并再次失败。对于每个失败(即输入中的每个字符),它将打印Bad entry. Enter a NUMBER:
。如果你输入一些字符较少的错误输入,你会看到我的意思。有多种方法可以解决此问题,但一个简单的解决方法是将整个输入读入字符串,并尝试解析它,而不是直接将cin
用于int
。以下是一些示例代码,需要使用C++11
的{{1}}之一进行编译。我已经用你的输入测试了它,它似乎达到你想要的效果。
#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;
}
答案 1 :(得分:1)
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;
}
请注意,当你有3个非int字符时,它会重复3次,当你有5次时,它会重复5次。 这是因为cin尝试第一个char,失败,尝试第二个char,失败等等,直到解析了所有输入字符。
答案 2 :(得分:0)
cin.fail()
返回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: ";
}
答案 3 :(得分:0)
无论如何都试试......当我直接在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' );
}
}
}