二维字符数组

时间:2013-07-15 06:43:19

标签: c string pointers

#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

为什么参数的类型为int

5 个答案:

答案 0 :(得分:3)

好吧

str[1]char*str[1][0]char
但是当你使用%s时,printf()期望一个指针,所以你试图将char转换为指针。

因此,char被提升为int

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

错误中说:

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

您的论据str[1][0]char,而不是预期的char *。在C中,char被视为int

答案 3 :(得分:0)

在第一种情况printf("%s",str1[1][0]);中,您将单个字符传递给printf函数和使用它的格式说明符%s。对于%s,printf函数需要字符串而不是字符。因此它会给出错误 与第一个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

有关Default argument promotionhere的详情。

答案 4 :(得分: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++;
 }
 }