使用printf()打印char数据类型

4
printf()函数使用格式说明符%s打印char *。标准没有规定char实现为有符号还是无符号。
因此,当char被实现为带符号的char时,如果我们使用%s打印unsigned char *,这样做是否安全?
在这种情况下应该使用哪个格式说明符?

指针没有符号,指针目标不进行算术处理,因此这并不重要。 - Martin James
@MartinJames 不清楚这里评论的适用性。也许它反映了问题的早期版本? - chux - Reinstate Monica
2个回答

8
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

三种类型的charsigned charunsigned char统称为字符类型。 C11 §6.2.5 15


谢谢!我已经阅读了标准,并看到%s需要字符类型,但我还不知道什么是字符类型。我应该更仔细地阅读标准。 - user8174916

0
如果你尝试这个:
#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' 实际上是指向内存中字符数组的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接