第一次警告
char review [MAXSTRING][MAXLINES];
它是一个矩阵,在您的情况下可以看作是 C 字符串数组。
每个 C 字符串是review[index]
索引从哪里来0
to MAXSTRING-1
So
scanf("%s",review)
是错误的,因为您必须将单个 C 字符串传递给函数,那么您必须编写:
scanf("%s",review[index]);
我建议您将输入字符串限制为每个字符串允许的最大字符数MAXLINES-1
使用,而不是scanf
:
fgets(review[index], MAXLINES, stdin);
第二次警告
同样的事情review
成员struct bookR
.
So
strcpy(k->b->review,review[MAXSTRING]);
must be
strcpy(k->b->review[index],review[MAXSTRING-1]);
正如您所看到的,您的 strcpy 调用存在第二个问题:第二个参数地址超出范围的字符串数组,调用未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.
其他警告
您的代码中有更多警告:
test.c:666:45: warning: declaration does not declare anything
enum genres{fiction,scientific,politics};
^
最后的考虑因素
我猜你想将定义切换到矩阵定义中,就像你所做的那样struct bookR
, like:
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);