2016-07-08 46 views
1

我覺得我正在做一些非常愚蠢的事情。我只想讓程序告訴用戶何時輸入非雙精度值,並繼續循環回到輸入值的cin。爲什麼這會導致與chars無限循環但不能雙打?

我希望用戶輸入任何數字。那麼重要的是做這個微不足道的數學和重複。它在這方面的工作很好,當像char這樣的意外輸入被輸入時,問題就來了。然後,輸入以某種方式將它發送到一個循環,在循環中循環數學問題,而不是僅僅告訴用戶他們必須鍵入一個數字並循環回到cin類型的新數字。

#include <iostream> 
#include <cstdlib> 

using std::cout; using std::cin; using std::endl; 

long double domath(long double i) 
{ 
    cout << i << "/" << 2 << "=" << i/2 << endl;  
    cout << i/2 << "*" << 10 << "=" << (i/2)*10 << endl << endl; 
    cout << 5 << "*" << i << "=" << 5*i << "\n\n";  
    return 0; 
} 

int main() 
{ 

    long double in = 0; 

    while(true) 
    { 
     cin >> in;   
     if (cin.fail()) {    
      in = char(int(in)); 
     }   
     domath(in); 
    } 
    system("pause>nul"); 
    return 0; 
} 
+0

請提供樣本輸入,預期和實際輸出。 –

+0

請刪除[tag:c]標籤。 –

+0

您需要清除cin,http://stackoverflow.com/questions/17928865/correct-way-to-use-cin-fail –

回答

1

你沒有在失敗的情況下清除cin,並無限試圖解析錯誤輸入翻一番,每失敗一次。你需要清除緩衝區錯誤的情況下:

if (cin.fail()) { 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    in = char(int(in)); 
} 

而且,不明白你試圖實現與

in = char(int(in)); 

in什麼是長雙變量,將舉行最後一次你分配給它的價值,不需要「轉換」它做數學。

+0

爲什麼我不必用數字輸入清除它? – x4kepa

+0

@ x4kepa,因爲它在解析時成功使用它 – buld0zzr

+0

你在哪裏學習這樣的東西?什麼時候做這種事情的具體知識從何而來? – x4kepa

0

難道你不能嘗試做這樣的事情嗎?

int x; 

if(std::cin >> x) 
    doSomethingCool(x); 
else 
    std::cout << "Error, not a valid integer!" << std::endl; 

退出你的循環壞的輸入。

我認爲這只是感覺更自然/看起來比清除緩存和所有其他的爵士清潔。只是我的觀點。

if (cin >> x) - Why can you use that condition?

編輯:BUL的回答仍然是,雖然一個好。

相關問題