2017-09-26 220 views
4

printf()函数使用格式说明%s打印char *。 该标准没有指定如何将char实现为有符号或无符号。打印数据类型char()

因此,作为签订charchar实现,我们用%s打印unsigned char *,是安全的做到这一点?

在这种情况下我们应该使用哪种格式说明符?

+0

指针没有标志,并且指针目标没有在算术上处理,所以没关系。 –

+0

@MartinJames不清楚[评论](https://stackoverflow.com/questions/46426473/printing-data-type-char-with-printf/46427667#comment79809984_46426473)如何适用于这里。也许它反映了​​问题的早期版本? – chux

回答

6

...当charsigned 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

三类charsigned charunsigned char统称为字符类型。 C11§6.2.515

+0

谢谢!我已阅读标准,并查看%的需要字符类型,但我还没有得到类型是什么性格。我应该更仔细地阅读标准。 – user8174916

-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 

所以 '名字' 实际上是一个指向字符在内存中的数组。