提问人:minyong kw 提问时间:9/30/2023 最后编辑:chqrlieminyong kw 更新时间:10/1/2023 访问量:85
在 C 语言中,当我打印没有“\0”的字符串时,为什么打印的是中文字符,而不是 ASCII?
in C, when I print string without '\0', why are Chinese characters printed, not ASCII?
问:
为什么要打印出汉字?printf("%s")
char str[5] = "Hello";
printf("%s", str);
当我运行这段代码时,我得到了.
我认为该函数从 str 表示的地址值开始,并将每个字节打印为 char,直到它遇到 null 字符。
但是,我知道汉字不能用一个字节打印。为什么要印上汉字?"Hello儆儆儆儆儆儆儆儆儆儆儆?"
printf("%s", str);
儆
如果内存不在 char 数组中,是否会将其识别为 Unicode?printf("%s")
答:
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
评论
\0
%.*s
printf("%.*s", sizeof str, str);