printf()
函数使用格式说明符%s
打印char *
。标准没有规定char
实现为有符号还是无符号。因此,当
char
被实现为带符号的char
时,如果我们使用%s
打印unsigned char *
,这样做是否安全?在这种情况下应该使用哪个格式说明符?
char
通过signed char
实现时,我们使用"%s"
打印unsigned char*
。这样做是安全的。char *cp = ...;
signed char *scp = ...;
unsigned char *ucp = ...;
printf("%s", cp); // OK.
printf("%s", scp); // OK.
printf("%s", ucp); // OK.
(%s) ... 参数应该是指向字符类型数组的初始元素的指针。... C11dr §7.21.6.1 8
三种类型的
char
,signed char
和unsigned char
统称为字符类型。 C11 §6.2.5 15
#include<stdio.h>
void main()
{
char name[]="siva";
printf("name = %p\n", name);
printf("&name[0] = %p\n", &name[0]);
printf("name printed as %%s is %s\n",name);
printf("*name = %c\n",*name);
printf("name[0] = %c\n", name[0]);
}
输出为:
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
所以,'name' 实际上是指向内存中字符数组的指针。