2016-05-18 201 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

相關問題