C错误:格式'%s'需要类型为'char *'的参数,但参数2的类型为'char(*)[100]'

时间:2016-05-18 05:59:25

标签: c struct compiler-warnings c-strings strcpy

我正在进行最近几天的练习,我正在接受这个警告(如标题所示)。我尝试了很多东西,但我真的不知道如何解决这个问题。我不擅长编程,所以有错误。下面是我正在使用的结构(不能更改,因为它是如何给出的):

    typedef struct bookR* book;
struct bookR{
    char author[MAXSTRING];
    enum genres{fiction,scientific,politics};
    int id;
    char review[MAXLINES][MAXSTRING];

};

typedef struct nodeR* node;
struct nodeR{
    book b;
    node next;

};

typedef struct listR* list;
struct listR{
    node head, tail; 
    int size;
};

以下是出现问题的代码的一部分:

 void addBook(book b, list bList){
char author [MAXSTRING];
int id;
char review [MAXSTRING][MAXLINES];
printf ("Give the author,`enter code here` id and review of the new book respectively");
scanf("%s",author);
scanf("%d",&id);
scanf("%s",review);
node k=(node)malloc(sizeof(struct nodeR));
assert(k);
k->next=NULL;
strcpy(k->b->author,author);
k->b->id=id;
strcpy(k->b->review,review[MAXSTRING]);}

这是我得到的警告:

  warning: format '%s' expects argument of type 'char *' but argument 2 has type 'char (*)[100]' [-Wformat=]
scanf("%s",review);
warining:passing argument 1 of 'strcpy' from incompatible pointer tupe [-Wincompatible-pointer-types]
strcpy(k->b->review,review[MAXSTRING]);

非常感谢任何帮助。感谢您的时间,感谢抱歉。

2 个答案:

答案 0 :(得分:2)

第一次警告

char review [MAXSTRING][MAXLINES];

它是一个矩阵,在你的情况下可以看作是一个C字符串数组。

每个C字符串都是review[index],其中索引从0MAXSTRING-1

所以

scanf("%s",review)

是错误的,因为你必须传递一个C-String才能运行,那么你必须写:

scanf("%s",review[index]);

我建议您使用而不是MAXLINES-1将输入字符串限制为每个字符串scanf允许的最大字符数:

fgets(review[index], MAXLINES, stdin);

第二次警告

review成员struct bookR也是如此。 所以

strcpy(k->b->review,review[MAXSTRING]);

必须是

strcpy(k->b->review[index],review[MAXSTRING-1]);

正如您所看到的,strcpy调用存在第二个问题:第二个参数解决了您的字符串数组越界,调用Undefined Behavior

其他警告

您的代码中会有更多警告:

test.c:666:45: warning: declaration does not declare anything
     enum genres{fiction,scientific,politics};
                                             ^

最终注意事项

我想您要将定义切换到矩阵定义中,就像在struct bookR中所做的那样,如:

char review [MAXLINES][MAXSTRING];

我认为使用特定prinf及其scanf / fgets来询问每个数据是最佳选择。

printf ("Give the author: ");
fgets(author, MAXSTRING, stdin);
printf ("Enter id: ");
scanf("%d",&id);
printf ("Enter review of the new book respectively: ");
fgets(review[index], MAXSTRING, stdin);

答案 1 :(得分:1)

  • 警告No1

    要使用char review [MAXSTRING][MAXLINES]; ,您需要将指针传递给它。你宣布:

    scanf("%s",review);
    

    但你读到了:

    scanf("%s", review[i]);
    

    您需要将其更改为:

    i

    其中0是从MAXSTRING-1strcpy(k->b->review,review[MAXSTRING]); 的索引。

  • 警告No2

    此外,声明:

    review[MAXSTRING-1]
    当你的阵列位置达到strcpy(k->b->review[index], review[MAXSTRING-1]); 时,

    越界。除此之外,您将分配给整个数组。所以你应该把它改成:

    array[x][y];
    

还有两个注意事项:

  1. 请参阅此link on why not to cast the result of malloc
  2. 请记住,例如:

    x

    y表示行, NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject]; 表示列。你有相反的方式,所以确保你不要感到困惑,当你想要列时你想要行和列,你真的可以访问行。