C中打印特殊字符时出错问题是%c与%s

问题描述

我从C开始,我发现%c和%s之间有一些区别,这时必须打印特殊字符。我不知道我做错了什么,还是C限制:

unsigned char str1[]="á";

printf("str1 c (%c)\n",str1[0]);
printf("str1 s (%s)\n",&str1[0]);

unsigned char str2[]="áéíóúñ";
printf("str2 s (%s)\n",str2);

输出为:

str1 c ( )
str1 s (á)
str2 s (áéíóúñ)

结论:当我尝试用%c编写特殊字符时,我看不到它。

解决方法

%c的{​​{1}}格式字符串导致将相应的参数转换为printf并解释为unsigned charunsigned char的长度为1个字节。非ASCII字符串中的一个字节不一定对应于您会识别为字符的任何内容。

很有可能是您用来将这些字符串的某些表示形式放入源代码中的编辑器使用某种Unicode编码方案对这两个字符串进行了编码。 This SO answer提供了一些信息,可帮助您开始使用C语言处理Unicode。

使用%s格式化字符串可以正常工作的原因是printf会开始转储字节,直到遇到空字节终止符为止。您的输出终端可能设置为与编辑器相同的编码方案,因此它能够按照您的预期正确解释这些字节。

,

好,现在我明白了。

如果我写:

unsigned char str3[]="a";
printf("%d\n",strlen((char *)str3));

输出为:

1

但是我写道:

unsigned char str1[]="á";
printf("%d\n",strlen((char *)str1));

输出为:

2

我知道字符大小可以是1,如果是特殊字符,可以是2,不是吗?