【问题标题】:C error:format '%s' expects argument of type 'char *'but argument 2 has type 'char (*)[100]'C 错误:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“char (*)[100]”
【发布时间】:2016-09-14 10:56:34
【问题描述】:

最近几天我正在做一个 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]);

非常感谢任何帮助。感谢您抽出宝贵时间,很抱歉发了这么长的帖子。

【问题讨论】:

  • scanf("%s",review) --> scanf("%s",review[index])
  • 我认为解决方案隐藏在警告本身中。
  • strcpy(k->b->review,review[MAXSTRING]); --> strcpy(k->b->review[index,review[MAXSTRING-1]);
  • @LPs 你错过了]

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


【解决方案1】:

第一次警告

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

【讨论】:

  • 我收到的第一个警告。但是第二个仍然有问题,我将其更改为strcpy(k->b->review[index,review[MAXSTRING-1]);。但我得到同样的错误。是不是因为“正如您所见,您的 strcpy 调用存在第二个问题:第二个参数地址您的字符串数组越界,调用未定义的行为”您说。@ 987654343@ 哎呀我忘记了知道如何解决它。
  • @Karamanis 你是如何声明和初始化index的?查看我的编辑
  • @LPs 这是因为您在编辑之前的答案中有错字:)
  • @LPs 你是关于错字的,但我仍然遇到同样的错误。你推荐的方式似乎好多了。我会尝试并通知你。感谢您的帮助和您的时间。
  • @Karamanis 我不了解您的编译器,我的gcc (Debian 4.9.2-10) 4.9.2 编译时没有警告。 :)
【解决方案2】:
  • 第 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]。除此之外,您将 line 分配给整个 array。所以你应该把它改成:

    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 表示列。您以相反的方式拥有它们,因此请确保您不会感到困惑,并确保您真正在需要行时访问行,在需要列时访问列。

【讨论】:

  • 非常感谢您的帮助。我不明白为什么它会越界。我把它改成了strcpy(k->b->review, review[MAXSTRING-1]);但我得到了同样的错误
  • 哇,你编辑的帖子好多了。我知道数组,但我没有注意到我已经用列切换了行。关于 malloc 的转换:在课堂上已经说过我们要转换结果。你建议它是node k=malloc(sizeof(struct nodeR));。我可以这样使用 malloc 吗?
  • @Karamanis 是的,当然可以! :) 这是正确的编程技术,但如果你正在做一个课堂项目,你可能应该按照老师的要求去做 :)
  • 如果你的老师让你投 malloc 使用 c....换学校或班级;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2013-05-10
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多