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
是从 0
到 MAXSTRING-1
的索引。
警告 2
此外,声明:
strcpy(k->b->review,review[MAXSTRING]);
越界,因为你的数组位置达到 review[MAXSTRING-1]
。除此之外,您将 行 分配给整个 数组 。所以你应该把它改成:
strcpy(k->b->review[index], review[MAXSTRING-1]);
另外两个注意事项:
- 看到这个link on why not to cast the result of malloc。
请记住,在这样的声明中:
array[x][y];
x
表示行,y
表示列。您以相反的方式拥有它们,因此请确保您不会感到困惑,并且在需要行时真正访问行,在需要列时真正访问列。
第一次警告
char review [MAXSTRING][MAXLINES];
它是一个矩阵,在你的例子中可以看作是一个 C 字符串数组。
每个 C 字符串是 review[index]
,其中索引从 0
到 MAXSTRING-1
所以
scanf("%s",review)
是错误的,因为你必须将单个 C 字符串传递给函数,那么你必须写:
scanf("%s",review[index]);
我建议您将输入字符串限制为每个字符串允许的最大字符数 MAXLINES-1
使用,而不是 scanf
:
fgets(review[index], MAXLINES, stdin);
第二次警告
struct bookR
的 review
成员也是如此。
所以
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);
最近几天我正在做一个 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
是从0
到MAXSTRING-1
的索引。警告 2
此外,声明:
strcpy(k->b->review,review[MAXSTRING]);
越界,因为你的数组位置达到
review[MAXSTRING-1]
。除此之外,您将 行 分配给整个 数组 。所以你应该把它改成:strcpy(k->b->review[index], review[MAXSTRING-1]);
另外两个注意事项:
- 看到这个link on why not to cast the result of malloc。
请记住,在这样的声明中:
array[x][y];
x
表示行,y
表示列。您以相反的方式拥有它们,因此请确保您不会感到困惑,并且在需要行时真正访问行,在需要列时真正访问列。
第一次警告
char review [MAXSTRING][MAXLINES];
它是一个矩阵,在你的例子中可以看作是一个 C 字符串数组。
每个 C 字符串是 review[index]
,其中索引从 0
到 MAXSTRING-1
所以
scanf("%s",review)
是错误的,因为你必须将单个 C 字符串传递给函数,那么你必须写:
scanf("%s",review[index]);
我建议您将输入字符串限制为每个字符串允许的最大字符数 MAXLINES-1
使用,而不是 scanf
:
fgets(review[index], MAXLINES, stdin);
第二次警告
struct bookR
的 review
成员也是如此。
所以
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);