2014-10-20 488 views
-4

我正在瀏覽C++ Faq的這個鏈接。 http://www.parashift.com/c++-faq/istreams-remember-bad-state.htmlFor循環沒有初始化和條件

在給定的循環程序中第一次迭代結束。

char name[1000]; 
int age; 

for (;;) { 
    std::cout << "Name: "; 
    std::cin >> name; 
    std::cout << "Age: "; 
    std::cin >> age; 
} 

正如解釋的數字提取器在輸入緩衝區中留下了非數字。可能是其基本的東西,但有人可以解釋如何爲循環終止條件?

+5

'for(;;)'是一個無限循環,它需要'break'或'throw'來打破循環。 – Jarod42 2014-10-20 18:12:36

+2

我不認爲循環在第一次迭代後結束 - 至少,它不適合我。 – Crummy 2014-10-20 18:13:11

+0

鏈接狀態如何處理'std :: cin'的錯誤 – Jarod42 2014-10-20 18:14:59

回答

3

for (;;)是一個無限循環,同爲while(1)while(true)

+1

雖然'for(;;)'是更慣用的... – Deduplicator 2014-10-20 18:17:01

3

我建議你重新閱讀你發佈的鏈接的問題。

爲什麼我的程序在第一次迭代後忽略了我的輸入請求?

這清楚地表明存在多於一次的迭代。實際的擔憂是,第一個之後的所有迭代都沒有從cin收到預期值。這通常是由於兩個主要原因:

  1. >>提取器在緩衝區中留下額外的非數字。當你使用>>提取器時,它會丟棄所有前面的空格,讀取它需要的字符,然後不再讀取任何字符(包括空格)。一個例子是試圖將15f作爲一個年齡。 15將被閱讀,離開f。這個值將被讀取爲名稱。
  2. 失敗位置位。在上面的例子中,如果前面的空格後面沒有可接受的字符,那麼會設置一個失敗位。這方面的一個例子就是試圖把「f」看作一個年齡。這個失敗位將被保存,並且在清除之前不會嘗試將來的讀取。

對於第一個問題的示例,請嘗試鍵入一個15f作爲年齡並查看會發生什麼情況。

Name: Test 
Age: 15f 
name = Test, age = 15 
Name: Age: 

對於第二個問題的一個非常明顯的例子,嘗試輸入年齡字符串並查看會發生什麼。您將以無限循環結束,不會等待更多輸入。

Name: Test 
Age: f 
Name: Age: Name: Age: Name: Age: Name: Age: Name: ... 

要修復這些問題,所有輸入到(包括)新行的輸入都必須丟棄。這是通過使用std :: cin.ignore方法完成的,如同一頁所示。如果設置了失敗位,您還需要使用std::cin.clear()清除它。

+0

感謝您解釋瑞恩。對不起,我的錯誤錯過了解釋的一點。再次感謝。 – Chaks 2014-10-20 18:26:55

+0

@Chaks不客氣。我再解釋一遍,以防萬一以前沒有意義。 – 2014-10-20 18:49:09