0
#include<stdio.h>
int main()
{
char str[3][10]={
                    "vipul",
                    "ss",
                    "shreya"
};

为什么这不起作用:

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

如果我想访问str

printf("%s",&str[1][0]);

或者这会做得很好

printf("%s",str[1]);

谁能解释一下?为什么第一个代码给出错误

prog.c: In function ‘main’:
prog.c:9:5: error: format ‘%s’ expects argument of type ‘char *’, but 
                   argument 2 has type ‘int’ [-   Werror=format]
cc1: all warnings being treated as errors

为什么参数有 type int

4

5 回答 5

3

str[1]是一个char*并且str[1][0]是一个char
但是当您使用 时%sprintf()需要一个指针,因此您尝试将 char 转换为指针。

所以你char被提升为int.

于 2013-07-15T06:50:51.023 回答
3
printf("%s",str[1][0]);

问题出在这一行。当 For%s格式说明符时, printf() 需要一个指向空终止字符串的指针。而str[1][0]只是一个 char (特别是第一个sin "ss"),它被提升为 int (默认参数提升)。这正是错误消息所说的。

于 2013-07-15T06:51:43.603 回答
1

错误中说:

format ‘%s’ expects argument of type ‘char *’

而你的论点str[1][0]是 a char,而不是预期的char *。在 C 中, achar被视为 a int

于 2013-07-15T06:51:42.370 回答
0

在第一种情况下printf("%s",str1[1][0]);,您将单个字符传递给您使用它的 printf 函数和格式说明符%s。对于%sprintf 函数需要字符串而不是字符。所以它给出了错误。
与您指定的第一个 printf 函数一样%s,您正在传递字符,参数提升将发生char并将提升为int.

•The default argument promotions are char and short to int/unsigned int and float to double
•The optional arguments to variadic functions (like printf) are subject to the default argument promotions

更多关于默认参数提升这里

于 2013-07-15T07:16:28.073 回答
0

在您的线路错误上:

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

您尝试在有字符的位置打印字符串(printf 中的“%c”)

所以只打印你的二维数组之一,你必须做这样的事情:

  int main()
  {
  int i;
  char str[3][10]=
  {
  "vipul",
  "ss",
  "shreya"
  };
  i = 0;
  while(str[0][i] != '\0')
  {
  printf("%c",str[0][i]);
  i++;
  }
  }

这很丑^^

相反,您可以使用 3 次单次迭代打印所有 2D 数组:

 int main()
 {
 int i;
 char str[3][10]=
 {
 "vipul",
 "ss",
 "shreya"
 };
 i = 0;
 while(i < 3)
 {
 printf("%s\n",str[i]);
 i++;
 }
 }
于 2013-07-15T07:33:32.690 回答