我有一个像这样的简单程序:
#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
这不是我想要的。然后我挖出了这个问题在 C 中将整数值存储在字符数组中 https://stackoverflow.com/questions/15308783/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
?
作为参考,这是一个简化版本艰难学习 C 的练习 8 http://c.learncodethehardway.org/book/ex8.html.
每个符号都有一个数字表示,所以基本上每个字符都是一个数字。这是字符及其值的表。
(source: asciitable.com http://www.asciitable.com/index/asciifull.gif)
所以,在你的代码中name[1] = numbers[1];
,你分配name[1]
to 2
,等于符号STX
在上面的 ASCII 表中,它不是可打印的字符,这就是为什么你会得到不正确的输出。
当你添加'0'
给你的name[1]
,它等于add 48 to 2
,所以带有数字的符号50
is '2'
,这就是为什么你会得到正确的输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)