2015-12-18 34 views
0

存儲整數,我創建一個結構隨書properties.I讓用戶創建具有for-loop.Like書[I] Books1,Books2等結構的對象...我不能在結構

問題是我不能在結構中存儲整數值。

代碼如下。

#include <stdlib.h> 
#include <stdio.h> 


struct Book { 
    int ID[]; 
    char book_name[80]; 
    char author_name[50]; 
    int pblsh_date[]; 
}; 
struct Book *Books; 

void Create(); 

int main() { 
    int count; 
    printf("How many books do you want to enter? "); 
    scanf("%d", &count); 


    Create(count); 

    //Show 
    printf("ID\t\tName\tAuthor\tPublish Year\n"); 
    for (int i= 0; i < count; i++) 
    printf("%d\t%s\t%s\t%d\n", Books[i].ID, Books[i].book_name, Books[i].author_name, Books[i].pblsh_date); 

    if (Books) { 
     free(Books); 
    } 
    getchar(); 
    return 0; 
} 

void Create(int count) { 

    Books = (struct Book*) malloc(count * sizeof(struct Book)); 
    int i; 
    for (i = 0; i < count; i++) { 

     printf("%d. Book's ID: ", i+1); 
     scanf("%d", Books[i].ID); 

     printf("Book's name: "); 
     scanf("%s", Books[i].book_name); 

     printf("Author: "); 
     scanf("%s", Books[i].author_name); 

     printf("Publish Year: "); 
     scanf("%d", Books[i].pblsh_date); 

    } 
} 

的代碼和錯誤的結果是:

http://tinyurl.com/go55cy6

+1

將方括號從ID和pblsh_date字段中除去。 –

+0

謝謝你的迴應:)我在第一個地方試過,但是當我沒有使用括號時,程序崩潰了。 http://tinyurl.com/guydtnl –

+1

由於'scanf(「%d」,Books [i] .ID);'和'scanf(「%d」,Books [i] .pblsh_date) ;'。應該是'scanf(「%d」,&(Books [i] .ID));'和'scanf(「%d」,&(Books [i] .pblsh_date));' –

回答

2

,您張貼結構的定義包含兩個空數組:int ID[];int pblsh_date[];。由於您沒有指定大小並且編譯器沒有拋出錯誤,因此它不會爲陣列數據分配任何存儲空間:陣列的長度爲零,並且在覆蓋它們後面的數據時覆蓋它們後面的數據。

既然你只想要一個整數,定義結構正確的方法是

struct Book { 
    int ID; 
    char book_name[80]; 
    char author_name[50]; 
    int pblsh_date; 
}; 

你需要對你的程序唯一的其他變化的參數scanfscanf("%d", &(Books[i].ID));scanf("%d", &(Books[i].pblsh_date));。原因是scanf需要你想放置結果的地址。雖然scanf("%s", Books[i].book_name);按原樣運行,但您需要將&運算符添加到int變量中。 book_name是一個數組,它在C中被當作包含要寫入的緩衝區地址的指針。 ID是一個int,所以你需要知道它的地址以知道在哪裏寫入。請注意,您是如何在main中用scanf("%d", &count);做到這一點的。

+1

數組不是指針。一個數組自動衰減爲一個指針。 – aschepler

+0

@aschepler。足夠公平,相應編輯 –

+0

只需注意「既然您沒有指定大小......它可能不會爲陣列數據分配任何存儲空間」:它是_definietly_不分配任何存儲空間。 – Turn