【问题标题】:Why does an input of char in place of int always display value zero?为什么输入 char 代替 int 总是显示值为零?
【发布时间】:2021-02-22 14:02:01
【问题描述】:

以下是我的代码:

#include <iostream>
using namespace std;

int main() {
  int num;
  cout<<"Enter a number: ";
  cin>>num;
  cout<<"The number is: "<<num;

  return 0;
}

如果我在cin&gt;&gt;num 的提示符下输入字符或字符串而不是整数,则num 的值每次都会返回为0。是因为它已经在 C++ 中以这种方式实现了,还是我错过了一些琐碎的概念?任何答案都会有很大帮助。

【问题讨论】:

  • @AsteroidsWithWings 真的吗?
  • @AsteroidsWithWings 哈哈我的意思是他在等着看什么。我的赌注是字符扫描码
  • 所以这是双关语。你抓到了吗?
  • .....非常好。

标签: c++ architecture cin


【解决方案1】:

这是 C++11 中引入的一个特性。来自cppreference;

之前:

如果提取失败(例如,如果在需要数字的地方输入了字母),则值保持不变并设置失败位。 (直到 C++11)

现在:

如果提取失败,则将零写入 value 并设置 failbit。如果提取导致值太大或太小而无法放入值,则写入 std::numeric_limits::max() 或 std::numeric_limits::min() 并设置故障位标志。 (c++11 起)

请注意,在 C++11 之前,您的代码可能会调用未定义的行为。如果输入失败,您使用的是未初始化的num。在这种情况下,0 作为输出与任何其他输出一样有效(因为未定义的行为是未定义的)。

【讨论】:

  • 谢谢!我确实需要了解 cppreference 的方法:)
  • @Anjishnu 标准库的某些区域对初学者来说非常困难(至少对我来说是这样)。当您阅读 std::basic_istream&lt;CharT,Traits&gt;::somehting 时,现在您可以将其阅读为 std::istream::something,它看起来比实际要复杂一些
【解决方案2】:

Istreams 对象具有检测错误输入的标志:只要将错误输入传递给 cin,就会设置错误输入标志。通过调用cin.fail() 并检查它是否评估为真,您可以主动监控输入是否不正确。在这种情况下,cin 会将值 0 分配给您传递的变量。

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多