2013-02-19 80 views
-2

我正在用C語言開發一個關於圖書館管理系統的迷你項目。但我在使用結構時遇到問題,我花了很多時間去理解,但我無法理解。不可預測的輸出


下面是一個代碼:

struct book 
{ 
char name;  
float price;  
int pages; 
}b1,b2,b3; 
int main() 
{ 
clrscr(); 
printf("Enter names,price & no.of pages of 3 books\n"); 
scanf("%c%f%d",&b1.name,&b1.price,&b1.pages); 
scanf("%c%f%d",&b2.name,&b2.price,&b2.pages); 
scanf("%c%f%d",&b3.name,&b3.price,&b3.pages); 
printf(" %c %f %d",b1.name,b1.price,b1.pages); 
printf(" %c %f %d",b2.name,b2.price,b2.pages); 
printf(" %c %f %d",b3.name,b3.price,b3.pages); 
getch(); 
return 0; 
}  

輸出:

Enter names,price & no.of pages of 3 books 
a 3.3 2 
b 2.2 3 
a 0.000000 2 
0.000000 0 b 0.000000 3 

有兩個混淆:

  1. 爲什麼scanf("%c%f%d",&b3.name,&b3.price,&b3.pages);未執行?
  2. 難以預測的輸出?
+1

請採取適當縮進代碼的時間。如果你不能費盡心思編寫你的問題,爲什麼我們應該煩惱去閱讀它? – meagar 2013-02-19 18:21:32

+2

你是什麼意思「無法正常訪問」? – 2013-02-19 18:21:41

回答

1

我希望你想要的格式代碼char*或一個固定大小的數組char的名稱和%s,而不僅僅是一個單一char%c,但我可能是錯的。

+0

他的下一個問題將是「爲什麼我的程序崩潰」!? – StoryTeller 2013-02-19 18:28:24

+0

是的確... :) – 2013-02-19 18:28:54

2

我相信隨後的scanf換行符會被放入下一個%c。 (所以書1將投入正常工作預定2將有它的名字是「\n」,並沒有浮動或int對於該線路上的頁面長度,所以它們是0書2)

嘗試添加\n在你scanf線,像這樣結束:

scanf("%c %f %d\n",&b1.name,&b1.price,&b1.pages); 

完整的示例在這裏:http://ideone.com/Gxs6Y8

如果你想比單個字符,所以你會做這樣的事情不再書名:

#define MAX_NAME_LENGTH 256 
struct book 
{ 
    char name[MAX_NAME_LENGTH]; 
    float price; 
    int pages; 
} b1, b2, b3; 

你會再使用%s代替%c和喜歡:

//note you no longer need & of b1.name as it already is a pointer to what you want 
scanf("%s%f%d",b1.name,&b1.price,&b1.pages); 

這裏舉例:http://ideone.com/EPYrJW

+0

是的,你寫...但我只是檢查..爲什麼%c不在這裏工作 – 2013-02-19 18:42:19

+0

@ArshadJuned%c查找單個字符,而%s是整個字符串。你可以在格式說明符[這裏]找到一個體面的教程(http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output)。 – 2013-02-19 18:52:12

+0

是的,我知道但如果我想只輸入1個字符,那麼? ...這只是一個代碼,我只是想在這裏爲什麼%c沒有正確訪問 – 2013-02-19 18:58:04