2012-11-04 193 views
2

我在幾個方面重寫這個循環中,嵌套如果和做田地,但行爲是相同的。只要用戶沒有輸入字符或字符串,它就會像預期的那樣工作。一旦用戶做了它,只是繼續旋轉循環,直到我CTRL + C它。While循環還沒有結束

從我的研究,當一個變量是一個號碼,用戶輸入一個字符或字符串,他們只是被轉換成他們的ASCII碼,在這種情況下,同時檢查應該工作。該數字應該大於允許值,並且應該提示用戶輸入新的數值。爲什麼它會無限循環?

寬度被聲明爲浮點數。

void setWidth() 
{ 
    std::cout << "\nPlease enter the width (use numbers greater than 0 and no greater than 20.0).\n"; 
    std::cin >> width; 
    while (width <= 0 || width > 20) 
    { 
     std::cin.clear(); 
     std::cin.ignore(); 
     std::cout << "You have entered a number outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n"; 
     std::cin >> width; 
    } 
} 

就像我說的,對於數字來說,它的效果很好,雙打,負片,不管。但是像「asdf」或「a」這樣的東西將會把它放在無限循環中。

好像我已經竭盡所能。爲什麼會發生?我的意思是我知道它爲什麼會循環,這是因爲數字不在0到20之間,但爲什麼它不會要求用戶輸入?我確實清除了緩衝區。

+0

讀到字符串,然後轉換爲數字(並驗證它是否可以)... – dbrank0

+5

'width'的數據類型是什麼? – Srinivas

+0

寬度的初始值是什麼? – billz

回答

4

std::cin >> width;失敗,因爲輸入是不是數字。它也不會消耗任何輸入,所以你陷入了無限循環。

爲了避免這種情況,你應該閱讀使用std::getline()輸入,然後嘗試將其轉換(std::ostringstream是一個選項),處理和相應報告故障。

0

嘗試檢查failbit上cin

3

默認爲cin.ignore()是忽略的單個字符。

如果你想忽略更長的字符串,你必須添加額外的參數,可能是cin.ignore(1000, '\n'),它跳過最多1000個字符或下一個換行符(以先到者爲準)。

1

CIN ::明確()「設置的差錯控制狀態的新值」 1,但剩餘的輸入還在這裏,仍然讀。

然後我猜測實際行爲取決於編譯器,因爲當我用g ++ 4.6.3編譯它並鍵入輸入「abc」時,它只循環三次,然後等待另一個輸入。

要清空緩衝區CIN你可能更願意看到How do I flush the cin buffer?

0

好,對所有幫助傢伙感謝...我終於設法得到它與CIN(不函數getline)上班,做什麼我一直除了我做了一個clearBuffer()函數。因此,getWidth函數不是從getWidth函數內部清除緩衝區,而是調用另一個函數..因此,getWidth函數會執行一些代碼...然後再運行其餘的代碼...

對於某些當它超出函數的正常工作原因,字符串和字符觸發錯誤..但如果cin.clear和cin.ignore保存在函數內,那麼我有這個問題。

所以最終的代碼如下所示。

void clearBuffer() 
{ 
    std::cin.clear(); 
    std::cin.ignore(80, '\n'); //Ignore the first 80 characters up to an Enter character. 
} 

void setWidth() 
{ 
    std::cout << "\n\t\tPlease enter the width.\n(use numbers greater than 0 and no greater than 20.0).\n"; 
    float temp = NULL; //Using temp here so that we dont write invalid characters to an actual variable. 
    std::cin >> temp; 
    clearBuffer(); 
    while (temp <= 0 || temp > 20) 
    { 
     std::cout << "\nERROR: You have entered width outside of the allowed range.\nPlease enter a number greater than 0 and no greater than 20.\n"; 
     std::cin >> temp; 
     clearBuffer(); 
    } 
    if(temp > 0 && temp <= 20) 
     width=temp; 
}