20

我正在尝试运行一个简单的 C 程序,但出现此错误:

警告:格式“%s”需要类型“char *”,但参数 2 的类型为“char (*)[20]”</p>

运行 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);
}
4

3 回答 3

45
于 2013-05-15T16:47:01.273 回答
4

除非它是、 或一元运算符的操作数sizeof,或者是用于在声明中初始化数组的字符串文字,否则“N-element array of ”类型的表达式将被转换(“decay”)为“pointer to”类型的表达式,它将计算数组中第一个元素的地址。_Alignof&TT

该数组me被声明为 20 个元素的数组char;通常,当表达式 me出现在您的代码中时,它将被视为“指向char”类型的表达式。如果你写过

scanf("%s", me);

那么你就不会得到错误;该表达式me将被转换为正确类型的表达式。

但是,通过使用&运算符,您绕过了该规则;char您传递的不是指向 的指针,而是指向( )数组的指针,这不是转换说明符所期望的,因此是诊断。charchar (*)[20]scanf%s

于 2013-05-15T17:08:43.180 回答
2

解决此问题的另一种方法是执行以下操作:

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

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

于 2019-06-12T14:35:47.693 回答