【问题标题】:&string_name or string_name for %s to print string in C&string_name 或 string_name 用于 %s 在 C 中打印字符串
【发布时间】:2015-02-09 02:02:16
【问题描述】:

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

char s[]="Question";

然后我注意到下面的两个 prtintf 都在终端中正确打印了字符串。

1.

printf("%s\n",s);

2.

printf("%s\n",&s);

在 C 中打印字符串的正确方法是什么。如果它们都相同,那么遵循的约定是什么? 1个还是2个?

谢谢。

【问题讨论】:

标签: c string printf


【解决方案1】:
char s[]="Question";
printf("%s\n",&s);

是未定义的行为,因为,

§7.21.6.1/8 转换说明符及其含义是:

[...]

s          如果没有 存在长度修饰符,参数应为指向             字符类型数组的初始元素。

§7.21.6.1/9 [...] 如果任何参数不是正确的类型 相应的转换规范,行为未定义。

s 在这种情况下将衰减为指针类型。由于& 产生一个指针,因此您传递给printf 的类型实际上是一个指向指针的指针。

【讨论】:

    【解决方案2】:

    第一个是正确的,对于第二个你应该从你的编译器中得到一个警告,因为它是 UB,类似于:

    [Warning] format '%s' expects argument of type 'char *'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多