2015-09-26 19 views
0

首先我想說我知道使用getline是一個更好的選擇,但是,我很好奇爲什麼這個代碼不能按預期工作:我不明白爲什麼cin的未知行爲

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

    while(1) { 
     int input; 
     cout << "---> "; 
     cin >> input; 
     if(cin.fail()) { 
      char rd = cin.get(); 
      cout << "failure" << rd << "=" << cin.fail() << " " << endl; 
     } 
    } 


    return 0; 
} 

預期:如果輸入一個整數,否則繼續CIN失敗了,我們拉一個字符從標準輸入,基本上輸出。然後我們繼續循環。

我看到它的方式,最終cin.get()應該清除不好的輸入;但它從來沒有這樣做:它陷入無限循環。什麼?

回答

3

cin.fail()檢測輸入的值是否符合變量中定義的值。 但如果cin.fail()爲真,則意味着

一)輸入值不適合變量

二)varialbe不會受到影響

三)河道內仍是破損

d)輸入值仍在緩衝區中,並將用於下一個「cin >>變量」語句。

因此,你必須做到以下幾點:

一)經修復的cin.clear河道內(); b)用cin.ignore(std :: numeric_limits :: max(),'\ n')清除緩衝區;

#include <iostream> 
    #include <string> 
    using namespace std; 

    int main() { 

    while(1) { 
    int input; 
    cout << "---> "; 
    cin >> input; 
    if(cin.fail()) { 
     char rd = cin.get(); 
     cout << "failure" << rd << "=" << cin.fail() << " " << endl; 
     cin.clear(); 
     cin.ignore(); 
     } 
     } 
    return 0; 
    } 
0

取出輸入整數後,按回車鍵後會換行爲一個字符。與字符輸入相同

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

    while(1) { 
     int input; 
     cout << "---> "; 
     cin >> input; 
     getchar(); 
     if(cin.fail()) { 
      char rd = cin.get(); 
      getchar(); 
      cout << "failure" << rd << "=" << cin.fail() << " " << endl; 

     } 
    } 
    return 0; 
}