Printf在引用字符串时起作用

时间:2014-10-14 02:53:44

标签: c printf

如果

char d[3];
     d[0] ='p';
     d[1] ='o';
     d[2] ='\0';

怎么来

printf("%s\n",d[0]);    

无法正常工作。

但如果我有

char n[2][4];
n[0][0]=’T’; n[0][1]=’o’; n[0][2]=’m’; n[0][3]=0;
n[1][0]=’S’; n[1][1]=’u’; n[1][2]=’e’; n[1][3]=0;

printf("%s %s\n", n[0],n[1]);

它会打印整个字符串吗?

4 个答案:

答案 0 :(得分:2)

由于

 d[0] - is a character

 n - is and array of and array of characters. I.e. an array of strings

答案 1 :(得分:2)

d[0]是数组中包含的第一个字符,而printf需要第一个字符的地址

这是您在源代码中使用d时获得的地址,或者您可以使用&(d[0])明确地处理该地址,该地址位于该地址的开头处。数组: - )。

您的二维数组工作的原因完全相同:n[0]n[0][0]地址,与d的相同方式相同地址d[0]

如果您将n[0][0](角色)传递给printf,则会遇到与通过d[0]时相同的问题。

答案 2 :(得分:1)

printf("%s\n",d[0]);技术上是undefined behaviorprintf的文档描述了各种转换说明符。

  

<强>取值

     

如果不存在l修饰符:期望const char *参数   是指向字符类型数组(指向字符串的指针)的指针。   数组中的字符被写入(但不包括)a   终止空字节(&#39; \ 0&#39;);

如果启用警告,即-Wall,您可能会获得:

warning: format '%s' expects argument of type 'char *', but argument 2 has type 
         'int' [-Wformat=]
      printf("%s\n",d[0]);

为什么第二个例子有效,请阅读array-to-pointer conversions。 James McNellis写道:

  

在C和C ++中,可以使用数组,就像它是指向它的指针一样   第一要素。实际上,给定一个名为x的数组,您可以替换   大多数&x[0]只使用x。

     

[...]

void f(int* p);

int x[5];
f(x);     // this is the same as f(&x[0])

所以n[0]相当于&n[0][0],正如d相当于&d[0]。但d 等同于d[0]

答案 3 :(得分:0)

当你尝试打印yor string d时,你将它传递给数组的第一个字符:

printf("%s\n",d[0]);
  1. d[0]表示&#34;存储在数组0&#34;的索引d中的内容。这是文字字符'p',而不是字符串的开头。
  2. 使用字符串(printf)将字符传递给%s我们未定义的行为可能会导致问题。不要这样做
  3. 使用printf打印字符串时,需要传递指向字符串的指针,该字符串是指向字符串第一个元素的指针(而不是元素本身)。

    &d[0];
    ^^ ^
    || Index 0
    |array d
    Address of
    

    这将计算数组0的{​​{1}}索引的地址 另外,我们可以利用数组降级到类型指针的事实。

    d

    这意味着我们可以取消&d[0] == &(*(d+0)) == d &运算符,只需传递[]

    d

    这将打印字符串。

    使用第二个示例,使用二维数组printf("%s\n", d); 可提供额外的间接级别(相当于[][])。
    这意味着当您调用char **时,当您传入printfn[0]时,您实际上是将指针传递给每个字符串中的第一个字符。即n[1]&n[0][0]

    ideone example