为什么我们不能访问存储在 \0 之后的字符串中的元素?

why we can't access elements stored in a string after \0?

我写了这个程序:

#include <stdio.h>
int main(){
char s[]="hi[=10=]h";
for(int i=0 ;i<4;i++)
printf("s[%d] = %c\n", i ,s[i]); // gives 4 chars 'h'-'i'-''-'h'
printf("%s", s);   // output : hi
return 0;
}

为什么程序不显示存储在\0之后的字符串,尽管它可能包含重要信息? 为什么函数 strlen(s) 给我们 2(s 的长度),而有 2 个以上的字符?

在 C 中,数组是一种类型的元素的连续序列 (C 2018 6.2.5 20),而字符串是由第一个空字符终止并包括第一个空字符的连续字符序列 (C 2018 7.1.1 1).

从根本上说,数组是程序用于任何目的的内存,字符串是数组中的特定数据,与标准库例程和其他为使用字符串而编写的例程结合使用。

字符串以空字符结尾,因为拥有处理此类字符串的例程很有用。它为程序员提供了简单的方法来打印字符串、连接字符串、搜索字符串中的字符,以及使用其他方式处理字符串。它并不总是最好的方法,但它很容易用于许多基本目的。例如,有时最好单独记录一个字符串的长度,这样我们就不需要通过检查所有字符来计算字符串长度。

字符串必须在数组内部,因为根据定义,字符串是连续的字符序列,而连续的事物序列出现在数组中。即使当前在数组中的字符串在数组末尾之前结束,数组仍然包含其所有元素,并且您始终可以通过数组索引访问这些元素,而不管字符串的长度如何。但是,处理字符串的库例程不会关心超出字符串末尾的数据。

如果您想处理数组中超出字符串末尾的数据,您可以编写源代码来实现。

Why the program does not show us the character string stored after [=29=] although it may contain an important message?

代码未尝试打印存储在 [=13=].

之后的字符 string

代码打印 字符串文字 "hi[=14=]h" 的 5 个字符中的 4 个,代码如下:

for(int i=0 ;i<4;i++)
  printf("s[%d] = %c\n", i ,s[i]);

代码然后打印 字符串文字 的第一个 字符串 "hi[=14=]h":

printf("%s", s);

"hi[=14=]h" 是一个 5 个字符 字符串文字 由 5 个 char 组成:'h''i''[= 20=]''h''[=20=]'。它由一个 string 和另一个 string.

组成

"%s" 指示 printf() 获取 字符串的地址 并打印字符直到 空字符 已读取,因此仅打印 'h''i'

"%s" not 直接 printf() 获取 字符串文字 的地址并打印其所有字符。


要打印字符串文字的所有字符,请使用循环。

for(size_t i=0 ;i<sizeof("hi[=12=]h"); i++)
  printf("[%zu] = '%c'\n", i ,"hi[=12=]h"[i]);

在 C 库中:

A string is a contiguous sequence of characters terminated by and including the first null character.