【问题标题】:Converting an integer to char by adding '0' - what is happening?通过添加“0”将整数转换为字符 - 发生了什么?
【发布时间】:2015-05-04 11:43:31
【问题描述】:

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

#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' + … 的版本真的很奇怪。为什么字符串会以“奇怪”的方式截断为Mx

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

【问题讨论】:

  • 将程序的输出通过管道传输到hexdump -C 并查看输出。字符 0 的 ascii 值是 48 (dec) 通过将 2 加到 48 你得到 ascii 值 50 这是 2 的字符。
  • 这个和ASCII码有关。如果您声明int numbers[] = {'1',' 2', '3', '4', '5'};,则无需添加'0'

标签: c char


【解决方案1】:

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


(来源:asciitable.com

因此,在您的代码 name[1] = numbers[1]; 中,您将 name[1] 分配给 2,这等于上面 ASCII 表中的符号 STX,它不是可打印的字符,这就是您得到错误输出的原因.

当您将'0' 添加到您的name[1] 时,它等于add 48 to 2,因此带有数字50 的符号是'2',这就是您得到正确输出的原因。

【讨论】:

    【解决方案2】:

    这不是我想要的。

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

    • 万一

      name[1] = chars[1];
      

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

    • 如果发生

      name[1] = numbers[1];
      

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

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

     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 以供参考。

    【讨论】:

    • 啊,我明白了,'2' 不可打印。但是当我执行'0' + 2 时会发生什么,为什么这会使 char 可打印?
    • @Max '0' 是十进制 48,'2' 是十进制 50。希望你能得到连接。
    【解决方案3】:

    在这一行:name[1] = numbers[1]; 中,您将 int 值分配给 char name[1] ,因此 numbers[1] 中的 int 值被视为某个 char 的 Ascii 代码,并且该 char 存储在 @ 987654325@。

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

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

    【讨论】:

    • 非常感谢您的解释!
    猜你喜欢
    • 2014-08-16
    • 2015-11-24
    • 1970-01-01
    • 2011-10-31
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多