【发布时间】: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'。