通过添加“0”将整数转换为 char - 发生了什么?

Converting an integer to char by adding '0' - what is happening?

我有一个像这样的简单程序:

#include <stdio.h>

int main(void)
{
    int numbers[] = {1, 2, 3, 4, 5};
    char chars[] = {'a', 'i'};
    char name[] = "Max";

    name[1] = chars[1];

    printf("name (before) = %s\n", name);

    name[1] = numbers[1];

    printf("name (after) = %s\n", name);

    return 0;
}

编译和运行给出:

$ gcc -std=c11 -pedantic -Wall -Werror ex8_simple.c
$ ./a.out
$ name (before) = Mix
$ name (after) = Mx

这不是我想要的。然后我挖出了问题 Store an integer value in a character array in C 并像这样更改了程序:

name[1] = '0' + numbers[1];  //replacing  >> name[1] = numbers[1];

然后它按照我的预期工作:

$ gcc -std=c11 -pedantic -Wall -Werror ex8_simple.c
$ ./a.out
$ name (before) = Mix
$ name (after) = M2x

虽然我不明白幕后发生了什么,尤其是没有 '0' + … 的版本真的很奇怪。为什么字符串以 "weird" 的方式被截断为 Mx

作为参考,这是 exercise 8 of Learn C The Hard Way 的简化版本。

Which is not what I want.

但是,您只为此编写了代码。让我解释一下这两种情况。

  • name[1] = chars[1];
    

name[1]a 被替换为 chars[1]i。所以,o/p 是 Mix.

  • 如果

    name[1] = numbers[1];
    

name[1]a 被替换为 numbers[1] 或 2(不是 '2'),这是不可打印的。(#注意) 所以,输出是 Mx.

但是,在您的第二种方法中,

 name[1] = '0' + numbers[1];

您正在通过添加 '0' 来存储 '2' 的 ASCII 等效值。因此,打印在输出中包含 '2'character 表示。

替代方法:

如果您修改 int 数组以存储 char 表示数字 0-9 的十进制等效值,则无需添加 '0',喜欢

int numbers[] = {'1', '2', '3', '4', '5'};

name[1] = numbers[1];

会给你想要的 o/p.


建议:请记住,C 中的数组索引是基于 0 的。

# 注意:请参阅此 ASCII table 以供参考。

每个符号都有一个数字表示,所以基本上每个字符都是一个数字。这是 table 个字符及其值。


(来源:asciitable.com

因此,在您的代码 name[1] = numbers[1]; 中,您将 name[1] 分配给 2,它等于上面 ASCII table 中的符号 STX,这不是 printable 字符,这就是为什么你会得到不正确的输出。

当你在你的name[1]上加上'0',它等于add 48 to 2,所以数字50的符号是'2',也就是为什么你得到正确的输出。

在这一行: name[1] = numbers[1]; 中,您将 int 值分配给 char name[1] ,因此 numbers[1] 中的 int 值被视为 Ascii 代码一些字符,该字符存储在 name[1] 中。

当您执行 name[1] = '0' + numbers[1]; 时,数字 (2) 将添加到数字 0 的 ascii 代码中,因此您会得到实际数字。 0的ascii码是48,加2得到50,就是2.

的ascii码

以前,当您只分配 name[1] = numbers[1]; 而没有分配 0 时,会打印带有 ascii 代码 0 的字符。因为它不是一个合适的可打印字符,所以没有显示任何内容(在我的机器上它显示为一些奇怪的表情符号)。