C++ 正确使用cin.fail()的方法

C++ 正确使用cin.fail()的方法,c++,cin,C++,Cin,使用cin.fail()的正确方法是什么 我正在制作一个程序,你需要输入一些东西。不太清楚是否需要输入数字或字符。当用户输入字符而不是数字时,控制台会发疯。如何使用cin.fail()修复此问题 或者有更好的方法吗?std::cin.fail()用于测试前面的输入是否正确 成功。然而,只使用 将流视为布尔值: if ( std::cin ) { // last input succeeded, i.e. !std::cin.fail() } if ( !std::cin ) {

使用
cin.fail()的正确方法是什么

我正在制作一个程序,你需要输入一些东西。不太清楚是否需要输入数字或字符。当用户输入字符而不是数字时,控制台会发疯。如何使用
cin.fail()
修复此问题

或者有更好的方法吗?

std::cin.fail()
用于测试前面的输入是否正确 成功。然而,只使用 将流视为布尔值:

if ( std::cin ) {
    //  last input succeeded, i.e. !std::cin.fail()
}

if ( !std::cin ) {
    //  last input failed, i.e. std::cin.fail()
}
在输入语法允许数字的上下文中 对于一个字符,通常的解决方法是逐行(或按顺序)读取它 其他字符串形式),并对其进行解析;如果你发现了 有一个数字,您可以使用
std::istringstream
来 转换它或任何数量的其他替代品(
strtol
,或
std::stoi
如果您有C++11)

但是,可以直接从数据库中提取数据 流:

cin.fail()

例如:

int main() {
  int i, j = 0;

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}
当您在上面运行短程序时,结果如下:

  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100

它在第六个值之后不会继续,因为它在读取第七个字后退出,因为这不是一个整数:
cin.fail()
返回
true

@Shumail92我目前没有它。对于这种情况,您通常会读取一个字符,然后检查它是否是数字(如果是,则转换为数字)你可以用一本好的C++书籍。但是看看:@JerryCoffin我会做相反的事情。对于初学者来说,跳过空白和在流中重新插入角色这样的事情并不明显。顺便说一句,你的问题是+1好吧,我从来不知道这是可能的。谢谢大家!@HetePerfan数字上说0是唯一的假值。是的,但在这种情况下它会起作用-我编辑了答案并添加了
int main()
。这里有点问题(除了格式错误)。首先,当然,
std::istream::fail()
从不返回“非零”或“零”:它返回
true
false
。其次,在给定的文本文件上,它输出所有内容,-100是一个整数,
std::cin.fail()
读取后将返回
false
。当输入
1.2
1,2
  30 40 50 60 70 -100 Fred 99 88 77 66
  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100