&;字符串\u名称或%s的字符串\u名称以C打印字符串
如果我在C中有以下字符串:&;字符串\u名称或%s的字符串\u名称以C打印字符串,c,string,printf,C,String,Printf,如果我在C中有以下字符串: char s[]="Question"; 然后我注意到下面的两个PRTINF在终端中正确地打印字符串 一, 二, 用C打印字符串的正确方法是什么?如果两者相同,那么遵循的约定是什么?1还是2 谢谢 第一个是正确的,对于第二个,您应该从编译器得到一个警告,因为它是UB,类似于: [Warning] format '%s' expects argument of type 'char *' 是未定义的行为,因为 §7.21.6.1/8转换规范及其含义为: [……] s
char s[]="Question";
然后我注意到下面的两个PRTINF在终端中正确地打印字符串
一,
二,
用C打印字符串的正确方法是什么?如果两者相同,那么遵循的约定是什么?1还是2
谢谢 第一个是正确的,对于第二个,您应该从编译器得到一个警告,因为它是UB,类似于:
[Warning] format '%s' expects argument of type 'char *'
是未定义的行为,因为
§7.21.6.1/8转换规范及其含义为:
[……]
sIf no l
如果存在长度修饰符,则参数应为指向
字符类型数组的初始元素
§7.21.6.1/9[…]如果任何参数的类型不正确
对应的转换规范,行为未定义
在此上下文中,
s
将衰减为指针类型。由于&
生成一个指针,因此传递给printf
的类型实际上是指向指针的指针 第二个是未定义的行为。第一个是正确的。在C语言中,数组名称的可能重复将降级为数组的地址。所以printf(“%s”,数组)是正确的。使用printf(“%s”、&array);表示打印阵列地址的地址,该地址未定义,可能/将导致seg故障事件。
printf("%s\n",&s);
[Warning] format '%s' expects argument of type 'char *'
char s[]="Question";
printf("%s\n",&s);