c - 为什么字符串数组的最后一个索引在 C 中不打印任何内容?

标签 c arrays

我很好奇为什么我的 29 大小数组中的最后一个元素是 27,而不是 28?为什么打印第28位的对象时出现空白? s 应该是第 28 位的最后一个对象吧?

#include <stdio.h>

int main(void) {
    char strArray[] = { "Jonsnow from Game of Thrones" };
    int lastElem = sizeof(strArray);

    printf("%s\n", strArray);
    printf("Size of array is: %d\n", sizeof(strArray));
    printf("first array value: %c \n", strArray[0]);
    printf("last array value: %c \n", strArray[lastElem - 1]);
    printf("last array value: %c \n", strArray[lastElem - 2]);

    return 0;
}

输出:

Jonsnow from Game of Thrones
Size of array is: 29
first array value: J
last array value:
last array value: s

最佳答案

C 字符串中的最后一个字节是空终止符,一个值为0 的字节,也写为'\0'strArray 是一个从 C 字符串常量初始化的 char 数组,它的大小恰好是初始化程序的大小,包括空字节,因此 strArray[lastElem-1] 是空字节 '\0'

printf %c 格式输出一个空字节应该可以正常工作,一个空字节被写入 stdout,但有可能您的终端会忽略此类字节并生成您发布的输出。您可以尝试将程序的输出重定向到一个文件,并使用十六进制编辑器检查该文件,看看它是否确实在换行符之前包含一个空字节。

我在装有 OS/X 的 MacBook 上得到了相同的行为:

chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte
Jonsnow from Game of Thrones
Size of array is: 29
first array value: J
last array value:
last array value: s

但这里是程序输出的二进制转储:

chqrlie@mba1 ~/dev/stackoverflow > ./nullbyte | od -bc
0000000   112 157 156 163 156 157 167 040 146 162 157 155 040 107 141 155
           J   o   n   s   n   o   w       f   r   o   m       G   a   m
0000020   145 040 157 146 040 124 150 162 157 156 145 163 012 123 151 172
           e       o   f       T   h   r   o   n   e   s  \n   S   i   z
0000040   145 040 157 146 040 141 162 162 141 171 040 151 163 072 040 062
           e       o   f       a   r   r   a   y       i   s   :       2
0000060   071 012 146 151 162 163 164 040 141 162 162 141 171 040 166 141
           9  \n   f   i   r   s   t       a   r   r   a   y       v   a
0000100   154 165 145 072 040 112 040 012 154 141 163 164 040 141 162 162
           l   u   e   :       J      \n   l   a   s   t       a   r   r
0000120   141 171 040 166 141 154 165 145 072 040 000 040 012 154 141 163
           a   y       v   a   l   u   e   :      \0      \n   l   a   s
0000140   164 040 141 162 162 141 171 040 166 141 154 165 145 072 040 163
           t       a   r   r   a   y       v   a   l   u   e   :       s
0000160   040 012
              \n
0000162

如您所见,第四行的空格之间确实存在一个空字节。

另请注意,程序中存在错误:%d 可能不适合类型为 size_t 的参数。 C99 格式是 %zu 但为了移植到 C99 运行时支持较差的系统,我建议这样做:

printf("Size of array is: %lu\n", (unsigned long)sizeof(strArray));

关于c - 为什么字符串数组的最后一个索引在 C 中不打印任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54411199/

相关文章:

python - 将一组 3 channel 图像从 Python 读取到二维数组以在 C 中使用的有效方法

c - 离散傅里叶变换给出不正确的结果

c - Fork, C 后无法杀死父进程

c - 用 C 中的时序替换打印语句

arrays - 尝试在 NodeJS 中使用 Jimp (Express) 从 Multer 上传多个图像时出现问题

php - 如何将数组添加到数组中成为二维数组?

javascript - json和多维数组

c - 从文件中获取行,放入结构数组,打印内容(作业)

python - 计算在某个范围内具有特定值的键的数量

arrays - Racket 中的 String-ref -- #\mean 是什么意思?