2010-08-04 46 views

回答

2

有沒有簡單的方法來做到這一點。通過>> operator的輸入實際上不適合與可能輸入錯誤事物的人進行交互。你將不得不以字符串形式讀取輸入,然後使用類似strtol的函數或自己的手動編碼來檢查它。

下面是採用strtol的做法的輪廓:

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

bool GetInt(istream & is, int & n) { 
    string line; 
    if (! getline(is, line)) { 
     return false; 
    } 
    char * ep; 
    n = strtol(line.c_str(), & ep, 10); 
    return * ep == 0; 
} 


int main() { 
    int n; 

    while(1) { 
     cout << "enter an int: "; 
     if (GetInt(cin, n)) { 
      cout << "integer" << endl; 
     } 
     else { 
      cout << "not an integer" << endl; 
     } 
    } 
} 
1

閱讀變量到一個臨時的字符串,分析它,看是否包含.,Ee,或其他非整數的字符,然後將其轉換爲int,如果它是有效的。

或者,只要將值讀入一個float並將其轉換爲int(根據需要舍入或截斷)即可。

+0

我使用類型casting:float a; a =(int)a;謝謝 – Snoob 2010-08-04 08:06:19

+1

我不應該那樣做,如果我是你,史努比。你的電話號碼仍然是一個浮動。也許'浮動一個; int b; b =(int)a;'會是一個更好的選擇。 – 2010-08-04 10:03:42

0

您可以使用臨時字符串和boost::lexical_cast將其轉換爲整數或浮點數變量如下:

#include <iostream> 
#include <boost/lexical_cast.hpp> 

int main() 
{ 
    using namespace std; 

    string buf; 
    cin >> buf; 

    bool int_ok = false, float_ok = false; 
    try { 
     int x = boost::lexical_cast<int>(buf); 
     int_ok = true; 
    } catch (boost::bad_lexical_cast e) { int_ok = false; } 
    if (!int_ok) { 
     try { 
      float x = boost::lexical_cast<float>(buf); 
      float_ok = true; 
     } catch (boost::bad_lexical_cast e) { float_ok = false; } 
    } 

    return 0; 
} 

有可能根據你想要達到的目標,做一個更好的解決方案。

1

可能最簡單的方法是接受float/double,將其轉換爲int,然後測試以查看轉換是否修改了該值。

int i ; 
    float f ; 
    std::cout << "Input: " ; 
    std::cin >> f ; 
    i = static_cast<int>(f) ; 
    if(static_cast<float>(i) != f) 
    { 
     std::cout << "Not an integer" ; 
    } 
    else 
    { 
     std::cout << "An integer" ; 
    } 

請注意,這會爲不能精確表示浮點但工作範圍可能滿足您的需求大的整數(最值超過6位數以上)失敗。

相關問題