2012-01-22 60 views
1
  char yes_no = 'z'; 
      int i = 0; 
      while ((yes_no != 'y') && (yes_no != 'n') ) 
      { 
       read(0, &yes_no, 1); 
       printf("%dA file already exists at your write location. Over write? (y/n)\n", i++); 
      } 

輸出看起來是這樣的:爲什麼這會在每次迭代中打印消息兩次?

0A file already exists at your write location. Overwrite? (y/n) 
1A file already exists at your write location. Overwrite? (y/n) 
a 
2A file already exists at your write location. Overwrite? (y/n) 
3A file already exists at your write location. Overwrite? (y/n) 

...等。

爲什麼它會經過循環兩次而不是每次都等待用戶輸入?

+3

爲什麼不通過調試器運行它並找出? –

回答

4

當您輸入一個字母並點擊輸入時,會將'a\n'放入流中。通過讀取1個字節,流中仍然有'\n',因此下次您撥打read()時,它會讀取'\n'而不是阻止並等待用戶輸入。您需要丟棄流中剩下的'\n'

+0

太棒了,我只是改變了讀取字節爲2,它的工作。謝謝。 – Marty

1

可能是因爲如果你輸入,, y''並按下回車鍵,你會在緩衝區中放入字符串「y \ n」 - 這是兩個字符,你的程序試圖讀取它們。

0

您應該向我們展示更多代碼。 (當你打印a?)我想你也輸入換行符,所以你回到循環的開始。

0

這是一種預感,但是因爲您輸入的數據是「a \ n」而不僅僅是「a」。所以在第一個循環中讀取塊因爲沒有數據。您輸入「a」,然後按回車。循環打印錯誤消息,然後再次循環。但是,這次在緩衝區中仍然存在換行符,並且在讀取之前不會再讀取請求。然後第三次緩衝區耗盡並再次讀取塊,等待更多輸入。