【问题标题】:Input a letter to 'int'输入一个字母到'int'
【发布时间】:2023-04-02 12:53:01
【问题描述】:

代码:

int a;
cin>>a;
cout<<a<<endl;

然后我使用g++ test.cpp,然后运行它。然后我在变量 a 中输入一个字母“b”。输出为 0。

但是,当我测试其他代码时:

cout<<int('b')<<endl;   // output: 98

为什么?有什么不同?

【问题讨论】:

  • 已为您删除了C 标签。请注意CC++ 是不同的语言。
  • 代码的第一位没有说将字符转换为整数。第二个可以。为什么你会期望它们是一样的?

标签: c++ type-conversion


【解决方案1】:

std::cin 是一个对象,是std::istream 的一个实例。 std::istream 已重载 &gt;&gt; 以支持 a variety of types。其中一种类型是&amp;int。当&gt;&gt;左边有一个std::istream,右边有一个整数引用时,调用istream&amp; operator&gt;&gt; (int&amp; val)方法。该方法的概念实现如下。

  1. 将 0 存储在累加器中
  2. 读取输入的字符
  3. 如果字符为 0-9,则将其十进制值添加到累加器中
  4. 如果不是,则返回累加器的值
  5. 返回步骤 2

当您向istream&amp; operator&gt;&gt; (int&amp; val) 提供“b”作为输入时,它会立即将“累积”0 存储在您的int 变量中。示例:

#include <iostream>

int main (const int argc, const char * const argv[]) {
    int b = 100;

    std::cout << b << std::endl;
    std::cin >> b;
    std::cout << b << std::endl;

    return 0;
}

执行:

100
b
0

至于转换,当您将值'b' 转换为整数时,内存中已经有一个值为 98 的字节,然后您将其打印为整数。当您使用 &gt;&gt; 时,内存中的结果值为 0,然后您将其打印为整数。

【讨论】:

    【解决方案2】:

    您尝试执行的输入操作失败。因为aint cin 需要int。因为它得到一个 char 它失败了。您可以通过将代码更改为:

    int a;
    cin>>a;
    if(!cin)
        cout << "input failed";
    else
        cout<<a<<endl;
    

    输入:

    a
    

    输出:

    input failed
    

    看到这个live example

    【讨论】:

    • 这是对cin &gt;&gt; &amp;int 的绝对错误处理。 0 是一个有效的整数输入,计算结果为 false,您可以将其声明为“输入失败”。
    【解决方案3】:

    当您使用 'b' 输入整数值时,您的程序认为您输入了一个无效数字,因此它不会通过 int('b') 分配值。仍然使用 a 的初始值

    【讨论】:

      【解决方案4】:

      不确定这是不是您的发现:

      char a;
      
      cin >> a;
      cout << a << endl;
      

      尝试将int更改为char, 当你输入3时,它会输出3; 当你输入b时,它会输出b;

      如果你想输出ascii,你可以这样cout:

      cout << (int) a << endl;
      

      那么当你输入b时你会得到98

      【讨论】:

        【解决方案5】:

        如果提取失败(例如,如果在数字所在的位置输入了字母 预期),值保持不变并设置故障位。 (直到 C++11)

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

        来自https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

        【讨论】:

          猜你喜欢
          • 2013-08-11
          • 2012-09-13
          • 2011-03-01
          • 1970-01-01
          • 2020-03-26
          • 2016-03-28
          • 1970-01-01
          • 2014-12-19
          • 1970-01-01
          相关资源
          最近更新 更多