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

时间:2013-05-23 07:10:18

标签: 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 * input;

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

6 个答案:

答案 0 :(得分:10)

因为数组已经可以用作指针,所以你不需要address-of运算符。

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

答案 1 :(得分:5)

尝试,

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

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

答案 2 :(得分: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);

旁注::如果您使用字符串地址,&inputinput的值相同,但语义上两者都不同。

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

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

  1. What does sizeof(&arr) returns?
  2. Issue with pointer to character array C++
  3. 修改:

    更改为:char *input无法帮助您,除非您将内存分配给input

    ,否则它将成为未定义的行为

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

scanf("%s", input);

你会得到答案。

答案 5 :(得分: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。

对阵列和指针也要经过this