我正在尝试运行一个简单的C程序但是收到此错误:“警告:格式'%s'需要类型'char ',但参数2的类型为'char()[20 ]'“
运行Mac OSX Mountain Lion 使用gcc 4.2.1在终端中编译
#include <stdio.h>
int main()
{
char me[20];
printf("What is your name?");
scanf("%s",&me);
printf("Darn glad to meet you, %s!\n",me);
return(0);
}
答案 0 :(得分:20)
scanf("%s",&me);
应该是
scanf("%s",me);
<强>阐释:强>
"%s"
表示scanf
期望指向char数组的第一个元素。 me
是一个对象数组,可以作为指针进行求值。这就是为什么你可以直接使用me
而不添加&
。将&
添加到me
将评估为‘char (*)[20]’
,并且您的scanf正在等待char *
代码评论家:
如果用户输入长度为&gt;的字符串,则使用"%s"
可能会导致缓冲区溢出20.所以将其改为"%19s"
:
scanf("%19s",me);
答案 1 :(得分:3)
除非它是sizeof
,_Alignof
或一元&
运算符的操作数,或者是用于在声明中初始化数组的字符串文字,类型“{元素数组T
”将被转换(“衰减”)为“指向T
的指针”类型的表达式,它将计算到数组中第一个元素的地址
数组me
被声明为char
的20个元素数组;通常,当表达式 me
出现在您的代码中时,它将被视为“指向char
的指针”类型的表达式。如果你写了
scanf("%s", me);
然后你就不会得到错误;表达式me
将被转换为正确类型的表达式。
然而,通过使用&
运算符,您绕过了该规则;而不是指向char
的指针,而是指向char
(char (*)[20]
)的数组,而不是scanf
期望%s
转换说明符,因此诊断。
答案 2 :(得分:1)
解决此问题的另一种方法是:
scanf("%s",&me[0]);
实际上,您必须给出数组的起点(在大多数语言中为0)。