查看完整版本: (已解決)[c語言]請問這while裡的scnaf、printf哪裡有問題?
頁: [1]

kuangtu 發表於 2017-3-28 02:00 AM

(已解決)[c語言]請問這while裡的scnaf、printf哪裡有問題?

本帖最後由 kuangtu 於 2017-4-7 02:13 AM 編輯

請問這code的問題出在哪?
當我輸入第一次 m 40
可正常顯示c = m, i = 40
但當我再次輸入 m 40
卻跑了4行奇怪的輸出...


https://gist.github.com/anonymous/66b3bcf073439f7c7832949f8d7cd6ac<div></div>

ren1244 發表於 2017-3-28 10:25 AM

參考下圖:
框框為stdin中的資料,而藍字是讀取到的部分。


所以在第二次讀取時,會把換行字元「\n」設定給c,但是後面因為是 M,無法以整數讀取,所以 i 值沒有改變。
第三次遇到scanf時,因為stdin中尚有資料,故不等使用者輸入就繼續往下跑。但這時可以順利讀取到M跟40了。

kuangtu 發表於 2017-3-28 12:22 PM

本帖最後由 kuangtu 於 2017-3-28 12:30 PM 編輯

ren1244 發表於 2017-3-28 10:25 AM static/image/common/back.gif
參考下圖:
框框為stdin中的資料,而藍字是讀取到的部分。


感謝你的回覆!

這個意思是, 第一次讀的資料, 還殘留\n在buffer裡?
所以我必須在每次讀完資料後, 都做清除input buffer的動作?
我有google到用fflush(stdin)函數, 但因他並不是標準c函式庫裡有定義的, 可能有移植性的問題.
還是我可以很簡單的在code裡的%c前面加個空格, 這樣就好?

scanf("(加空格)%c %d", &c, &i);

亦或者在scanf後加上getchar(), 這樣做會比較好?

scanf("%c %d", &c, &i);
getchar();

因為這2種作法都可以讓程式如預期的跑出結果, 但我想知道這樣做是否有不妥當的地方, 工作上大家都怎麼用?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-3-28 01:15 PM

先聲明我不是在軟體業工作喔,只是有興趣。

如果是目前提出的兩個方案
我比較偏向「加空格」來解決
因為如果使用者在「m 40」前後有多輸入空格
這個方法還是可以正確處理

不過最好的方法應該還是檢查輸入是否符合格式
至於這個格式是設計時要考量的
可能要從下列三種選一種:
1. 嚴格限制符合格式才會處理
2. 允許有多餘的空格或TAB
3. 只要讀取到資料,後面的自動忽略...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

kuangtu 發表於 2017-3-28 01:52 PM

ren1244 發表於 2017-3-28 01:15 PM static/image/common/back.gif
先聲明我不是在軟體業工作喔,只是有興趣。

如果是目前提出的兩個方案


感謝你的協助! 我有多學到一些東西! 謝謝!<br><br><br><br><br><div></div>
頁: [1]