1

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

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;

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

4

6 回答 6

10

因为数组已经可以用作指针,所以不需要地址操作符。

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

于 2013-05-23T07:11:32.020 回答
5

尝试,

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

您不必将地址运算符 ( &) 与数组的名称一起提供input

于 2013-05-23T07:12:16.293 回答
1

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

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

注意参数2&inputscanf()

scanf("%s", &input);
       ^       ^ 
       |       argument-2 
       argument-1

要更正此代码,您应该像这样编写 scanf:

scanf("%s", input);

旁注::&input如果您将地址字符串化,则两者的值input都相同,但语义上两者都不同。

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

&input要了解并input阅读这两个答案之间的区别:

  1. sizeof(&arr) 返回什么?, 和
  2. 指向字符数组 C++ 的指针的问题

编辑:

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

于 2013-05-23T07:32:38.327 回答
0

char input[10]是一个字符数组。
input本身代表数组的基地址,即 a char *
您不需要使用运算符 ( )的地址&。相反,使用:

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

如果使用char * input;,则需要使用 为其分配空间malloc。但在这种情况下,也不需要使用运营商的地址。

于 2013-05-23T07:16:37.850 回答
0
scanf("%s", input);

你会得到答案。

于 2013-05-23T07:19:57.830 回答
0
char input[10];   
scanf("%s", &input);

scanf需要地址来存储将要接收的数据。数组名称已经像指针一样起作用,因此您不需要&运算符来获取地址。

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

当你这样做时&input,它表示一个指向 10 个字符的 char 数组的指针。char (*)[10]

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

对数组和指针也进行此操作。

于 2013-05-23T07:23:02.130 回答