✔ 最佳答案
你的程式僅有一個「受制於人(scanf)」的被動問題!
過去曾有不少人跟你一樣陷入這個迷惑中,俺也答了不少次!
解決方法出奇的簡單,簡單到會令你扼腕喟嘆!
請把這一行 scanf ("%c",&b);
改成 scanf (" %c",&b);
簡單的在%前面加一個空白,便可藥到病除。
祝你享用愉快!
2009-09-29 14:58:34 補充:
針對scanf的這個現象,導因於標準輸入流(stdin)殘留資料所致。
以你這程式為例,當你 scanf("%d",&a);輸入一個整數時,「enter」鍵仍留在輸入流內,若你接下來執行 scanf ("%c",&b); 這個殘留的「enter 」便會「直接」當成字元資料存入變數b。由於「enter 」字元僅換行,在螢幕看不到輸出字元,所以你「誤」以為沒 printf。
有人因此埋怨scanf為何不自動先清除輸入流,但真正深入研究後,會讚許scanf的這種安排,因為有蠻多進階的應用上,需要保留輸入流的完整性!這說來話長,無暇贅述。
2009-09-29 15:00:08 補充:
(續上)
這就好像上餐舘,上了一道素菜,要何口味,允許你自行添加酸甜苦辣。
scanf 便提供了一個調味料,讓它在接收格式化資料之前,先清掉殘留的空白字元(包含enter),這個調味料,便是俺在回答內文所述的。(既是調味料,簡單當然是第一要務。)
另外,你在炒菜時,若誤把砂糖當鹽用,壞了一鍋菜,只好丟棄重做。
同理,scanf 時,若誤把字元當數值輸入,便會錯誤,這時便得自行清除輸入流的資料再重新執行 scanf ,簡易的用法之一便是用 fflush(stdin)。
2009-09-29 15:18:11 補充:
(續上)
請善用 fflush(stdin) 在合理的地方,而非一朝被蛇咬,十年怕草繩,逢scanf 便套用一下,這便濫用了!
舉一個簡單的例子,若你設計一個中(英)文輸入練習的程式,便不能濫用 fflush(stdin),否則 keyin 高手也會望天長嘆!
但在處理scanf的錯誤時,fflush(stdin) 卻又不失為一個簡易好用的工具。