2012-07-12 147 views
1

,我有以下結構圖書C結構陣列輸入

typedef char String[256]; 

typedef struct 
{ 
    String name; 
    int year; 
    float price; 
} Book; 

陣列

int main(int argc, const char * argv[]) 
{  
    Book books[5]; 

    for (int i=0; i<5; i++) { 
     books[i] = inputBook(); 
    } 

    return 0; 
} 

inputBook()函數

Book inputBook() 
{ 
    Book myBook; 

    //Name 
    puts("Enter Book Name:"); 
    gets(myBook.name); 

    //Publishing Year 
    puts("Enter Book Publishing Year:"); 
    scanf("%i", &myBook.year); 

    //Price 
    puts("Enter Book Price:"); 
    scanf("%f", &myBook.price); 

    return myBook; 
} 

出於某種原因,第一本書輸入進展順利但是當試圖輸入第二本書和第二個電話給inputBook()時,我可以設置書名,它直接跳到年進口。

什麼問題?

謝謝!

+0

什麼是'String'? – hmjd 2012-07-12 10:52:33

+0

是C++代碼嗎? – Jeeva 2012-07-12 10:53:18

+0

typedef char String [256]; C代碼 – jkigel 2012-07-12 10:53:40

回答

4

要糾正,更換:

gets(myBook.name); 

有:

scanf("%255s", myBook.name); /* 255 as name is 256 chars. */ 

scanf()將跳過任何空白字符,但gets()不會。一個換行符被認爲是一個空格字符,並且在輸入pricestdin中會有一個換行符,導致gets()讀取換行符並且什麼都不讀。

值得一讀:warning:gets function is dangerous

+0

但'的scanf( 「%255秒」,myBook.name);'不掃描的多個詞。參見[這裏](http://stackoverflow.com/questions/19379141/c-multiple-words-input-using-scanf) – mrudult 2013-10-15 10:51:50

0

也許你可以在輸入之前嘗試fflush(stdin)。

Book inputBook() 
{ 
    Book myBook; 

    fflush(stdin); 

    // rest of the code 
} 
+1

刷新'stdin'是未定義行爲AFAIK。 'fflush'通常用於輸出流。 – 2012-07-12 10:58:14

+0

@PavanManjunath爲了避免使用fflush(stdin),可以編寫一個簡短的func來讀取stdin中的所有字節。這也解決了這個問題。 – Rango 2012-07-12 11:01:46

1

這是因爲變量myBook只在inputBook範圍內是有效的,並且只要函數退出銷燬。

您應該將想要初始化的書籍項目作爲函數的參數傳遞。

功能inputBook()...

void inputBook(Book *ptBook) 
{ 
    if(ptBook==NULL) 
     return; 

    //Name 
    puts("Enter Book Name:"); 
    gets(ptBook->name); 

    //Publishing Year 
    puts("Enter Book Publishing Year:"); 
    scanf("%i", &ptBook->year); 

    //Price 
    puts("Enter Book Price:"); 
    scanf("%f", &ptBook->price); 
} 

主要功能...

int main(int argc, const char * argv[]) 
{  
    Book books[5]; 

    for (int i=0; i<5; i++) { 
     inputBook(&books[i]); 
    } 

    return 0; 
} 
+1

但是返回值正在被複制,不是嗎?這是好的(http://stackoverflow.com/questions/2302351/assign-one-struct-to-another-in-c)。 – hmjd 2012-07-12 11:11:29

+0

它取決於編譯器...例如。 SDCC不支持此功能。 http://sourceforge.net/apps/trac/sdcc/wiki/Standard%20compliance – 2012-07-12 11:25:53

1

我想你需要下一次迭代之前刷新標準輸入。你的標準輸入流中有不透明的CRLF。

使用fflush(stdin);在循環的開始。

0
#include <stdio.h> 

typedef char String[256]; 

typedef struct 
{ 
    String name; 
    int year; 
    float price; 
    } Book; 
Book inputBook() 
{ 
    Book myBook; 

    //Name 
    puts("Enter Book Name:"); 
    getchar(); 
    gets(myBook.name); 

    //Publishing Year 
    puts("Enter Book Publishing Year:"); 
    scanf("%i", &myBook.year); 

    //Price 
    puts("Enter Book Price:"); 
    scanf("%f", &myBook.price); 

    return myBook; 
} 
int main(int argc, const char * argv[]) 
{ 
    Book books[5]; 

int i = 0; for (i=0; i<5; i++) { 
    books[i] = inputBook(); 
} 

return 0; 
} 
+0

在fflush的使用(標準輸入):我要指出的..! 你也可以使用,fgetc ..以及如果你使用gcc .. fflush可能不支持.. – Ashutosh 2012-07-12 12:25:06