我正在进行最近几天的练习,我正在接受这个警告(如标题所示)。我尝试了很多东西,但我真的不知道如何解决这个问题。我不擅长编程,所以有错误。下面是我正在使用的结构(不能更改,因为它是如何给出的):
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]);
非常感谢任何帮助。感谢您的时间,感谢抱歉。
答案 0 :(得分:2)
第一次警告
char review [MAXSTRING][MAXLINES];
它是一个矩阵,在你的情况下可以看作是一个C字符串数组。
每个C字符串都是review[index]
,其中索引从0
到MAXSTRING-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-1
到strcpy(k->b->review,review[MAXSTRING]);
的索引。
警告No2
此外,声明:
review[MAXSTRING-1]
当你的阵列位置达到strcpy(k->b->review[index], review[MAXSTRING-1]);
时,越界。除此之外,您将行分配给整个数组。所以你应该把它改成:
array[x][y];
还有两个注意事项:
请记住,例如:
x
y
表示行, NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject];
表示列。你有相反的方式,所以确保你不要感到困惑,当你想要列时你想要行和列,你真的可以访问行。