C - 警告:格式'%s'需要类型'char *',但参数2的类型为'char(*)[20]'

时间:2013-05-15 16:46:11

标签: c

我正在尝试运行一个简单的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);
}

3 个答案:

答案 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的指针,而是指向charchar (*)[20])的数组,而不是scanf期望%s转换说明符,因此诊断。

答案 2 :(得分:1)

解决此问题的另一种方法是:

scanf("%s",&me[0]);

实际上,您必须给出数组的起点(在大多数语言中为0)。