为什么我的C编译器会给出警告?

为什么我的C编译器会给出警告?,c,string,gcc,C,String,Gcc,初学者问题。我有以下代码: char input[10]; scanf("%s", &input); 我的编译器抛出以下警告: warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]' warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]' 改为: char *

初学者问题。我有以下代码:

char input[10];   
scanf("%s", &input);
我的编译器抛出以下警告:

warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]'
warning: format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]'
改为:

char * input;

似乎没有帮助。我做错了什么?

因为数组已经可以用作指针,所以您不需要输入运算符的地址


如果您再次阅读警告消息,您将看到,当您在数组上使用运算符的地址时,您会得到一个指向该数组的指针。

因为数组已经可以用作指针,所以您不需要输入运算符的地址

如果您再次阅读警告消息,您将看到,当您在数组上使用运算符地址时,会得到指向该数组的指针。

请重试

char input[10];   
scanf("%s", input);
您不必为运算符(
&
)的地址提供数组
输入的名称

试试看

char input[10];   
scanf("%s", input);

您不必为
运算符(
&
)的地址提供数组
输入的名称

字符输入[10]
是一个字符数组。
input
本身表示数组的基址,即
char*

您不需要将操作员的地址(
&
)与之一起使用
。相反,请使用:

char input[10];   
scanf("%s", input);

如果使用
char*输入
,您需要使用
malloc
为其分配空间。但在这种情况下,也不需要使用
运算符的地址。

字符输入[10]
是字符数组。
scanf("%s", input);
input
本身表示数组的基址,即
char*

您不需要将操作员的地址(
&
)与之一起使用
。相反,请使用:

char input[10];   
scanf("%s", input);
如果使用
char*输入
,您需要使用
malloc
为其分配空间。但在这种情况下,也不需要使用
运算符的地址

scanf("%s", input);
你会得到答案的

char input[10];   
scanf("%s", &input);
你会得到答案的

char input[10];   
scanf("%s", &input);
需要存储将接收的数据的地址。数组名称的作用已经类似于指针,因此不需要使用
&
运算符来获取地址

format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]'
执行
&input
操作时,它指示一个指针指向一个10字符的字符数组<代码>字符(*)[10]

input
本身就是
char*
,只需要作为第二个参数传递给scanf

对数组和指针也进行检查

需要存储将接收的数据的地址。数组名称的作用已经类似于指针,因此不需要使用
&
运算符来获取地址

format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]'
执行
&input
操作时,它指示一个指针指向一个10字符的字符数组<代码>字符(*)[10]

input
本身就是
char*
,只需要作为第二个参数传递给scanf


也检查数组和指针。

%s
格式字符串接受类型为
char*
的参数,其中as
&intput
的类型为
char(*)[10]
,这就是您收到警告的原因

format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]
注意:参数
2
scanf()中的
&input

要更正此代码,您应该编写scanf,如下所示:

scanf("%s", input);
旁注::如果您使用字符串地址,则
&input
input
在值方面是相同的,但在语义上是不同的

&input
是数组的地址,它是
char(*)[10]
类型,而
input
类型是
char[10]

要理解
&input
input
之间的区别,请阅读以下两个答案:

  • ,及
  • 编辑:


    更改为:
    char*input
    将不会帮助您,相反,它将成为未定义的行为,除非并且直到您将内存分配给
    input
    %s
    格式字符串接受
    char*
    类型的参数,其中as
    &intput
    char(*)类型[10]
    这就是您收到警告的原因

    format '%s' expects type 'char *', but argument 2 has type 'char (*)[10]
    
    注意:参数
    2
    scanf()中的
    &input

    要更正此代码,您应该编写scanf,如下所示:

    scanf("%s", input);
    
    旁注::如果您使用字符串地址,则
    &input
    input
    在值方面是相同的,但在语义上是不同的

    &input
    是数组的地址,它是
    char(*)[10]
    类型,而
    input
    类型是
    char[10]

    要理解
    &input
    input
    之间的区别,请阅读以下两个答案:

  • ,及
  • 编辑:


    更改为:
    char*input
    将不会帮助您,相反,它将成为未定义的行为,除非并直到您将内存分配给
    input

    令牌
    input
    已经是
    char*
    ,您正在传递一个在此上下文中使用的
    char**
    ,char数组“衰减”为指向其第一个元素的指针,所以指向堆栈分配的字符数组的指针。不要这样做。您将很快遇到缓冲区溢出。使用
    scanf(“%9s”,输入)
    。同时读取。令牌
    输入
    已经是一个
    char*
    ,您正在传递一个在此上下文中使用的
    char**
    ,char数组“衰减”为指向其第一个元素的指针,因此指向指向堆栈分配的char数组的指针。不要这样做。您将很快遇到缓冲区溢出。使用
    scanf(“%9s”,输入)
    。也可以阅读。你可以包括关于&input和InputAlternative的类型,可以使用
    &input[0]
    ,但是
    input
    实际上是等效的,输入速度更快。你可以包括关于&input和InputAlternative的类型,可以使用
    &input[0]
    ,但是
    input
    实际上是等价的,而且打字速度更快。
    input
    实际上是
    char[10]
    类型。它可以衰减为
    char*