C 为什么printf只显示第一个字母?

C 为什么printf只显示第一个字母?,c,unicode,printf,C,Unicode,Printf,首先,我有一个函数,其中符号存储在unsigned char*type中。例如Abcdef它是[65 0][98 0][99 0][100 0][101 0][102 0][33 0][63 0]Unicode中每个符号2个字节 当我使用for(unsigned char I=0;I因为printf(“%s”,pointer)字面意思是:从pointer存储的字符开始打印每个字符,直到遇到'\0' 在'a'之后紧接着有一个'\0',所以只打印第一个字符。第二个值是0,它是一个无符号字符*数组类型

首先,我有一个函数,其中符号存储在
unsigned char*
type中。例如
Abcdef
它是
[65 0][98 0][99 0][100 0][101 0][102 0][33 0][63 0]
Unicode中每个符号2个字节

当我使用
for(unsigned char I=0;I因为
printf(“%s”,pointer)
字面意思是:从
pointer
存储的字符开始打印每个
字符,直到遇到
'\0'


'a'
之后紧接着有一个
'\0'
,所以只打印第一个字符。

第二个值是0,它是一个
无符号字符*
数组类型:
printf
停止。你能给我们看一个吗?看看所有的
0
字节吗?
%s
用于打印一个以空结尾的c字符串;它是正确的调用了以Null结尾的字节字符串。因此,您只获取第一个
0
字节之前的第一个字符,然后它不再尝试读取。当您说“Unicode系统”时你是指UTF 16或者类似的东西,对吗?Unicode本身不是一个编码,它只是一个字符到数字的映射。UTF 16是一个可变宽度编码:一些字符需要2字节编码,一些则需要4。@ MartinBonner,即使在这个特定的情况下,C和C++的答案恰好相同,这一般都不明显。有足够多的问题被标记在两种语言上,并且答案不同。将问题限制在一种语言上是有意义的。@FiddlingBits:可能。这将在Windows(其中
wchar\u t
存储UTF-16)上起作用。它在倾向于四字节
wchar\u t
存储UCS4的Linux平台上不起作用(这不是UCS4)。@FiddlingBits:No.
%ls
使用指向
wchar\u t
的指针,而不是指向
char
的指针。即使
wchar\u t
是16位小尾端(MSVC定义不正确,与Unicode不兼容)访问< <代码> char < /C> >数组是一个别名侵犯,它也可能是失败的对齐要求。@ FIDDLIGITB:我想这将是正式的UB,因为<代码> %LS是针对<代码> WCARGYT*<代码>。但是,C++标签从这个问题中被移除了,我对C.的这些事情还不确定100%。