Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&;字符串\u名称或%s的字符串\u名称以C打印字符串_C_String_Printf - Fatal编程技术网

&;字符串\u名称或%s的字符串\u名称以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

如果我在C中有以下字符串:

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);