#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
?
答案 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
答案 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++;
}
}