2016-05-18 71 views
4

我正在做最后几天的练习,有这个警告(如标题所示)。我尝试了一堆东西,但我不知道如何完全解决这个问题。我不擅长编程,所以有错误。下面是我使用的结构(这不能被改变,因为这是他们是如何给出):C错误:格式'%s'需要类型为'char *'的参数,但参数2的类型为'char(*)[100]'

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

'的scanf( “%s” 时,回顾)' - >'的scanf( “%S”,综述[指数])' – LPs

+3

我认为解决的办法是隐藏在警告本身。 – SKD

+0

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

回答

1
  • 警告一号

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

    char review [MAXSTRING][MAXLINES]; 
    

    ,而是你读:

    scanf("%s",review); 
    

    您需要将此更改为:

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

    其中i0MAXSTRING-1的索引。

  • 警告NO2

    此外,声明:

    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指明列。您以相反的方式使用它们,所以请确保您不会感到困惑,并且在需要列时需要行和列时才能访问行。

+0

非常感谢您的帮助。我不明白为什么它出界了。我把它改成了'strcpy(k-> b-> review,review [MAXSTRING-1]);'但是我得到了同样的错误 – Karamanis

+0

@Karamanis看到我编辑的文章并告诉我它是否有帮助:) – Marievi

+0

哇,帖子好多了。我知道阵列,但我没有注意到我已经用列切换了行。关于malloc的铸造:在课堂上,我们已经说过要施放结果。你建议它是'node k = malloc(sizeof(struct nodeR));'。我可以像那样使用malloc吗? – Karamanis

2

第一警告

char review [MAXSTRING][MAXLINES]; 

它是一个矩阵,其可以被看作是C-串的你的情况的阵列。

每个C-string是review[index]其中index去从0MAXSTRING-1

所以

scanf("%s",review) 

是错误的,因为你必须通过一个C字符串的功能,那么你必须写:

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

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

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

2日警告

同样的事情的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]; 

我认为可以通过特定的prinfscanf/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); 
+0

我得到它的第一个警告。但第二个stil有一个问题,我将它改为'strcpy(k-> b-> review [index,review [MAXSTRING-1]);'。但我得到同样的错误。是否因为“你可以看到你的strcpy调用中存在第二个问题:第二个参数定位你的字符串数组,从而引起你说的错误行为”,'test.c:666:45:warning :声明没有声明任何东西 枚举类型{小说,科学,政治};'哎呀我忘了这一点,我知道如何解决它。 – Karamanis

+0

@Karamanis你是如何声明和初始化'index'的?看到我的编辑 – LPs

+0

@LPs这是因为你在编辑之前在你的答案中有错字:) – Marievi

相关问题