【问题标题】:Correct way to use cin.fail()正确使用 cin.fail() 的方法
【发布时间】:2013-07-29 12:40:19
【问题描述】:

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

我正在制作一个程序,您需要在其中输入一些内容。是否需要输入数字或字符不是很清楚。当用户输入字符而不是数字时,控制台会发疯。我该如何使用cin.fail() 来解决这个问题?

或者有没有更好的方法?

【问题讨论】:

  • @Shumail92 我目前没有。
  • 对于这种情况,您通常会读取一个字符,然后检查它是否是数字(如果是,则转换为数字)。
  • 您可以使用一本好的 C++ 书籍。但看看:en.cppreference.com/w/cpp/io/basic_ios/fail
  • @JerryCoffin 我会反其道而行之。对于初学者来说,跳过空格并在流中重新插入字符等操作并不明显。
  • 顺便说一句,为您的问题 +1

标签: c++ cin


【解决方案1】:

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)。

但是,可以直接从 流:

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}

【讨论】:

  • 好吧,我从来不知道这是可能的。谢谢!
【解决方案2】:

cin.fail() 如果最后一个 cin 命令失败则返回 true,否则返回 false。

一个例子:

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

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}

现在假设你有一个文本文件 - input.txt,它的内容是:

  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

它不会在第 6 个值之后继续,因为它会在读取第七个 单词 后退出,因为那不是整数:cin.fail() 返回 true。

【讨论】:

  • @hetepeperfan 从数字上讲,0 是唯一的错误值。
  • 是的,但它会在这种情况下工作 - 我编辑了答案并添加了int main()。
  • 这里出了点问题(除了格式不好)。首先,当然,std::istream::fail() 永远不会返回“非零”或“零”:它返回 true 或 false。其次,在给定的文本文件上,它输出所有内容,-100 是一个整数,std::cin.fail() 将在读取后返回false。
  • 输入1.2或1,2时失败
  • @JamesKanze “非零”和“零”在 C++ 中分别为真和假。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2012-02-23
  • 2013-01-09
  • 2010-12-28
  • 2012-04-26
  • 2014-10-24
相关资源
最近更新 更多