C中的字母数组最后有一个额外的'@'

时间:2018-01-10 18:19:54

标签: c arrays

我正在尝试使用字母'相应的ASCII代码构建两个字符串数组 - 一个使用小写字母,一个使用大写。

char lc['z' - 'a'];
for(int i = 'a'; i <= 'z'; i++ ) {
    lc[i - 'a'] = i ;
}

printf("%s", lc);

char uc['Z' - 'A'];
for(int i = 'A'; i <= 'Z'; i++ ) {
    uc[i - 'A'] = i ;
}

printf("\n%s", uc);

我得到的输出是正确的,除了对于两个表,最后有一个额外的@符号,我不知道为什么。如果我将循环条件改为i&lt; 'Z'相反,它切断了z / Z,而不是@,所以我怀疑它可能与'\ 0'符号结束字符串数组有关?

1 个答案:

答案 0 :(得分:4)

你的怀疑是正确的:你需要用&#39; \ 0&#39;来结束。因为sh """ version='1.2.3.4' IFS=. read a b c d <<EOF \$version EOF echo \"a\" \$a """ (以及C中几乎所有其他字符串处理函数)都希望它们像这样。此外,您还需要在整个字母表的数组中再添加一个元素。你的代码应该是:

printf

如果您想知道&#39; @&#39;数组之后的内存可能只是一个随机值,因为它还没有到达&#39; \ 0&#39; char lc['z' - 'a' + 2]; for(int i = 'a'; i <= 'z'; i++ ) { lc[i - 'a'] = i ; } lc['z' - 'a' + 1] = '\0'; printf("%s", lc); char uc['Z' - 'A' + 2]; for(int i = 'A'; i <= 'Z'; i++ ) { uc[i - 'A'] = i ; } uc['Z' - 'A' + 1] = '\0'; printf("\n%s", uc); 继续打印。