【问题标题】:current = current * 10 + (c - '0');当前 = 当前 * 10 + (c - '0');
【发布时间】:2014-03-06 15:39:53
【问题描述】:

我正在尝试通过这段代码读取未知数量的整数:

while (1) {
        int c = getchar ();
        if (c == EOF)
            break;
        else if (isdigit (c))
            current = current * 10 + (c - '0');
        else {
            total += current;
            current = 0;
        }
}

我知道current = current * 10 + (c - '0');有,但我不知道为什么会有c - '0'。你能给我解释一下吗?提前谢谢你。

【问题讨论】:

  • 旁注:当前未在您的代码中初始化。
  • @hivert 它可以在while循环之上初始化。

标签: c input


【解决方案1】:

c - '0' 是将单个 ASCII 数字转换为整数的基本方法。

例如,如果c 等于'9',则其整数值为0x39'0' 的 ASCII 值是 0x30,所以,0x39-0x30 == 0x09 等于整数值 9

这是数字的 ASCII 表:

chr  hex   dec
'0'  0x30  48
'1'  0x31  49
'2'  0x32  50
'3'  0x33  51
'4'  0x34  52
'5'  0x35  53
'6'  0x36  54
'7'  0x37  55
'8'  0x38  56
'9'  0x39  57

【讨论】:

  • 顺便说一句,数字字符 '0', '1', ... '9' 并不是 ASCII 特有的:它在 EBCDIC 中也是有效的,事实上,这是 C 标准所规定的。
【解决方案2】:

字符 '0' 的 ASCII 值不为 0。但是,幸运的是,字符 '1' 的 ASCII 值是 '0' + 1,以此类推到 2、3、4、5、6、7、8 和9. 因此(伪代码)'n' - '0' == n 对每个数字都成立。

【讨论】:

  • 抱歉吹毛求疵,但'n'-'0' 是常量,等于62(至少在ASCII 中)。
【解决方案3】:

数字通过递增值以 ASCII 表示:0 是 48,1 是 49,依此类推。由于C中的字符只是变相的整数,所以你可以从任何其他数字中减去0的ASCII值,得到该数字的数值。例如,'1' - '0'49 - 48 相同,即1

【讨论】:

    【解决方案4】:

    C 指定 10 位十进制数字,这并不奇怪,因为

    0 1 2 3 4 5 6 7 8 9

    C11 §5.2.1 进一步指出“在源和执行基本字符集中,上述十进制数字列表中 0 之后的每个字符的值应比前一个字符的值大一。

    因此,当评估字符串的字符是数字时,语言保证从十进制数字char 中减去'0' 将得到它的整数值。

    if (isdigit (c))
      int value = c - '0';
    

    依赖于使用 ASCII 的char

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 1970-01-01
      • 2020-08-04
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多