通过添加“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
的字符。因为它不是一个合适的可打印字符,所以没有显示任何内容(在我的机器上它显示为一些奇怪的表情符号)。
我有一个像这样的简单程序:
#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
.
以前,当您只分配 name[1] = numbers[1];
而没有分配 0
时,会打印带有 ascii 代码 0
的字符。因为它不是一个合适的可打印字符,所以没有显示任何内容(在我的机器上它显示为一些奇怪的表情符号)。