的printf()
函数使用格式说明%s
打印char *
。 该标准没有指定如何将char
实现为有符号或无符号。打印数据类型char()
因此,作为签订char
时char
实现,我们用%s
打印unsigned char *
,是安全的做到这一点?
在这种情况下我们应该使用哪种格式说明符?
的printf()
函数使用格式说明%s
打印char *
。 该标准没有指定如何将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.18
三类
char
,signed char
和unsigned char
统称为字符类型。 C11§6.2.515
谢谢!我已阅读标准,并查看%的需要字符类型,但我还没有得到类型是什么性格。我应该更仔细地阅读标准。 – user8174916
如果你试试这个:
#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
所以 '名字' 实际上是一个指向字符在内存中的数组。
指针没有标志,并且指针目标没有在算术上处理,所以没关系。 –
@MartinJames不清楚[评论](https://stackoverflow.com/questions/46426473/printing-data-type-char-with-printf/46427667#comment79809984_46426473)如何适用于这里。也许它反映了问题的早期版本? – chux