&string_name 或 string_name for %s 在 C 中打印字符串
&string_name or string_name for %s to print string in C
如果我在 C:
中有以下字符串
char s[]="Question";
然后我注意到以下两个 prtintf 都在终端中正确打印了字符串。
1.
printf("%s\n",s);
2.
printf("%s\n",&s);
在 C 中打印字符串的正确方法是什么。如果两者相同,那么遵循的约定是什么? 1 个还是 2 个?
谢谢。
第一个是正确的,对于第二个你应该从你的编译器那里得到一个警告,因为它是 UB,类似于:
[Warning] format '%s' expects argument of type 'char *'
char s[]="Question";
printf("%s\n",&s);
是未定义的行为,因为,
§7.21.6.1/8 The conversion specifiers and their meanings are:
[...]
s If no l
length modifier is present, the argument shall be a pointer to the
initial element of an array of character type.
§7.21.6.1/9 [...] If any argument is not the correct type for the
corresponding conversion specification, the behavior is undefined.
s
在此上下文中将衰减为指针类型。由于 &
产生一个指针,因此您传递给 printf
的类型实际上是一个指向指针的指针。
如果我在 C:
中有以下字符串char s[]="Question";
然后我注意到以下两个 prtintf 都在终端中正确打印了字符串。
1.
printf("%s\n",s);
2.
printf("%s\n",&s);
在 C 中打印字符串的正确方法是什么。如果两者相同,那么遵循的约定是什么? 1 个还是 2 个?
谢谢。
第一个是正确的,对于第二个你应该从你的编译器那里得到一个警告,因为它是 UB,类似于:
[Warning] format '%s' expects argument of type 'char *'
char s[]="Question";
printf("%s\n",&s);
是未定义的行为,因为,
§7.21.6.1/8 The conversion specifiers and their meanings are:
[...]
s If no l length modifier is present, the argument shall be a pointer to the initial element of an array of character type.
§7.21.6.1/9 [...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.
s
在此上下文中将衰减为指针类型。由于 &
产生一个指针,因此您传递给 printf
的类型实际上是一个指向指针的指针。