在 C 语言中,当我打印没有“\0”的字符串时,为什么打印的是中文字符,而不是 ASCII?

in C, when I print string without '\0', why are Chinese characters printed, not ASCII?

提问人:minyong kw 提问时间:9/30/2023 最后编辑:chqrlieminyong kw 更新时间:10/1/2023 访问量:85

问:

为什么要打印出汉字?printf("%s")

char str[5] = "Hello";
printf("%s", str);

当我运行这段代码时,我得到了. 我认为该函数从 str 表示的地址值开始,并将每个字节打印为 char,直到它遇到 null 字符。 但是,我知道汉字不能用一个字节打印。为什么要印上汉字?"Hello儆儆儆儆儆儆儆儆儆儆儆?"printf("%s", str);

如果内存不在 char 数组中,是否会将其识别为 Unicode?printf("%s")

c 字符串 内存 null

评论

1赞 pmg 9/30/2023
这是对 ASCII 范围之外的值的最终解释。
6赞 dimich 9/30/2023
“没有'\0'的字符串不是字符串。尝试打印它会导致未定义的行为。实际行为取决于许多参数,包括终端仿真器和操作系统实现详细信息。
1赞 n. m. could be an AI 9/30/2023
没有 .stackoverflow.com/questions/72436704/......\0
0赞 Toby Speight 9/30/2023
如果您需要打印非字符串的字符序列,我们可以使用转换来限制字段的大小,例如 .%.*sprintf("%.*s", sizeof str, str);
0赞 Cem Polat 9/30/2023
字符串文字长度为 6 个字节,包括 null 字符。但是,“str”数组大小为 5 个字节。行为可能会根据编译器设置、控制台编码页面而更改。等。应分配大小大于最大文本大小 1 的 char 数组,以确保可以分配结束 null 字符。所以 str[6] 应该纠正这个问题。

答:

3赞 chqrlie 9/30/2023 #1

代码具有未定义的行为,因此任何事情都可能发生。

这是一个初步的解释:从数组中输出所有字节,并继续处理内存中跟随的任何字节,直到找到空字节。这些字节值可以是任何值,并且可能会为终端生成无效的编码,该终端可能使用 UTF-8 或 Big5 或其他一些本地编码方案。如果您的系统使用中文语言环境,终端可能会使用中文字符 (Jǐng),这意味着警告小心向用户发出此无效序列的信号。printf

鉴于发布的输出,似乎有大约 11 个无效序列和一个字节之前的字节,产生 11 个 Jǐng 汉字 (Hànzì) 和一个 .0x3F?

在不同的系统上运行代码,由不同的编译器编译,使用不同的选项,或者只是在不同的时间运行代码,可能会产生其他输出,甚至根本没有输出。

正如 Toby Spleight 所评论的那样,由于它是未定义的行为,因此代码可能会执行其他操作,而不是生成输出,或者生成输出。例如,如果幸运的话,它会帮助您诊断问题。如果你不太幸运,它似乎会“工作”,直到你把程序交付给你的客户......SIGSEGV

评论

0赞 Toby Speight 9/30/2023
由于它是未定义的行为,因此代码可能会执行其他操作,而不是生成输出,或者生成输出。例如,如果幸运的话,它会帮助您诊断问题。如果你不太幸运,它看起来会“工作”,直到你把程序交付给你的客户。SIGSEGV