2012-05-01 100 views
0

我學會了(自學)當今C語言的結構基礎知識,並編寫了這個簡單的代碼。它正在編譯沒有任何錯誤。我知道成功的編譯並不是無錯軟件的保證。執行時,它僅掃描兩個結構變量的輸入並給出錯誤的顯示。爲了簡單起見,我選擇了一個char來存儲書名。我無法找出這裏的錯誤。你能找到一個嗎?C結構代碼編譯但沒有運行

#include<stdio.h> 

int main(void) 
{ 
    struct book 
    { char name; 
     float price; 
     int pages; 
    }; 

    struct book b[3]; 

    int i; 

    for (i = 0; i <= 2; i++){ 
     printf("\nEnter name, price and pages "); 
     scanf("%c %f %i", &b[i].name, &b[i].price, &b[i].pages); 
    } 

    for (i = 0; i <= 2; i++) 
     printf("\n%c %f %i",b[i].name, b[i].price, b[i].pages); 

    return 0; 
} 
+1

您的意見是什麼?你的錯誤輸出是什麼? – texasbruce

+1

僅僅因爲編譯時沒有錯誤,這並不意味着你的程序會實際做你想做的。這通常被稱爲* bug *。 –

+0

@GregHewgill我知道編譯不能保證無錯軟件。我很想知道上面提到的代碼中的錯誤,但這並不明顯。如果你能看到一個bug,請提及它.. – KawaiKx

回答

1

您需要通過添加while((ch=getchar())!='\n');(刷新輸入緩衝區)刪除 「額外」 輸入(請聲明char ch;):

for (i = 0; i <= 2; i++){ 
    printf("\nEnter name, price and pages "); 
    scanf("%c %f %i",&b[i].name,&b[i].price, &b[i].pages); 
    while((ch=getchar())!='\n'); //eat the chars 
} 

教程/職位:

  1. "Flushing" the input stream
  2. How to Get User Input from console -- safely.
+0

真棒..它工作!非常感謝..你能多討論一下,究竟發生了什麼問題。 (爲了擴大我對這個問題的學習) – KawaiKx

+1

@Saurabh - 很高興你能工作。解決方案是「刷新」輸入流/緩衝區。 – adatapost

+1

@Saurabh - scanf()只從stdin(鍵盤)中讀取,直到匹配格式字符串(字符,空格,浮點數,空格,然後是整數)的所有內容。這會使回車/換行符在輸入緩衝區中浮動,並且AVD的while()循環會消耗數據,直到收到數據爲止:然後您就可以爲下一個條目準備好了。 – AAT