printf()
函数使用格式说明符%s
来打印char *
。
该标准未指定char
如何实现为已签名或未签名。
因此,当char
以签名char
实施时,我们使用%s
来打印unsigned char *
,这样做是否安全?
在这种情况下我们应该使用哪种格式说明符?
答案 0 :(得分:7)
...在
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.18
char
,signed char
和unsigned char
这三种类型统称为字符类型。 C11§6.2.515
答案 1 :(得分:-1)
如果您尝试这样做:
#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'实际上是指向内存中字符数组的指针。