为什么我的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*