C error:format '%s' expects argument of type 'char *'but argument 2 has type 'char (*)[100]'

C error:format '%s' expects argument of type 'char *'but argument 2 has type 'char (*)[100]'

最近几天我正在做一个 c 语言的练习,我收到了这个警告(如标题所示)。我尝试了很多东西,但我真的不知道如何准确解决这个问题。我不擅长编程所以有错误。以下是我正在使用的结构(无法更改,因为它们是这样给出的):

    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]);

非常感谢任何帮助。感谢您抽出宝贵时间,很抱歉 post.

  • 1 号警告

    为了使用scanf,你需要传递一个指针给它。您已声明:

    char review [MAXSTRING][MAXLINES];
    

    但是你阅读了:

    scanf("%s",review);
    

    您需要将其更改为:

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

    其中 i 是从 0MAXSTRING-1 的索引。

  • 警告 2

    此外,声明:

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

    越界,因为你的数组位置达到 review[MAXSTRING-1]。除此之外,您将 分配给整个 数组 。所以你应该把它改成:

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

另外两个注意事项:

  1. 看到这个link on why not to cast the result of malloc
  2. 请记住,在这样的声明中:

    array[x][y];
    

    x表示行,y表示列。您以相反的方式拥有它们,因此请确保您不会感到困惑,并且在需要行时真正访问行,在需要列时真正访问列。

第一次警告

char review [MAXSTRING][MAXLINES];

它是一个矩阵,在你的例子中可以看作是一个 C 字符串数组。

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

所以

scanf("%s",review)

是错误的,因为你必须将单个 C 字符串传递给函数,那么你必须写:

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

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

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

第二次警告

struct bookRreview 成员也是如此。 所以

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);