2015-04-03 103 views
1

我已經搜索了這個答案,似乎沒有人知道如何解決這個錯誤。我希望輸入是一個整數。如果輸入是雙精度型,我希望它發送一個錯誤。區分int和double

int creatLegs = 0; 
string trash; 
bool validLegs = true; 
do 
{ 
    cout << "How many legs should the creature have? "; 
    cin >> creatLegs; 

    if(cin.fail()) 
    { 
     cin.clear(); 
     cin >> trash; //sets to string, so that cin.ignore() ignores the whole string. 
     cin.ignore(); //only ignores one character 
     validLegs = false; 
    } 

    if (creatLegs > 0) 
    { 

     validLegs = true; 
    } 

    if (!validLegs) 
    { 
     cout << "Invalid value, try again.\n"; 
    } 

} while (!validLegs); 

它似乎幾乎工作。它發送錯誤,但只有在移到下一個循環之後。我怎樣才能解決這個問題?爲什麼它仍然顯示錯誤信息,但在顯示之前仍然繼續?

+0

對不起,我不太明白你的意思。不,它不會將其存儲爲int。如果我輸入的內容不是int,它不知道該怎麼做。它吐出垃圾郵件,直到我添加了「if(cin.fail())」 – 2015-04-03 06:48:19

+1

cout <<「\ n」不刷新輸出緩衝區,而cout << endl。見http://en.cppreference.com/w/cpp/io/manip/endl – amdn 2015-04-03 06:53:14

回答

0

我認爲你要讀的數據字符串,然後檢查它通過字符驗證它是整數 - 如果每個字符都是一個數字,那麼我們有整數,我們可以解析它。

問題與流是,如果你想讀取整數,但通過十進制,它讀取數字直到點。這部分是一個適當的整數,所以cin.fail()返回false

示例代碼:

#include <iostream> 
#include <string> 
#include <cctype> 
#include <cstdlib> 

using namespace std; 

int main() { 
    int creatLegs = 0; 
    bool validLegs = true; 
    do 
    { 
     cout << "How many legs should the creature have? "; 
     string input; 
     getline(cin, input); 

     validLegs = true; 
     for (string::const_iterator i = input.begin(); validLegs && i != input.end(); ++i) { 
      if (!isdigit(*i)) { 
       validLegs = false; 
      } 
     } 

     if (!validLegs) 
     { 
      cout << "Invalid value, try again.\n"; 
     } else { 
      creatLegs = atoi(input.c_str()); 
     } 

    } while (!validLegs); 

    cout << creatLegs << endl; 
} 

當然這不是一個完美的解決方案。如果有任何前導或尾隨空格(或任何其他字符,如+-),程序將失敗。但是,如果需要,您總是可以添加一些代碼來處理這些情況。

+0

我絕對可以做這個工作。謝謝! – 2015-04-03 07:09:38

+0

你可以[接受我的回答](http://stackoverflow.com/help/accepted-answer)[而不是說謝謝](http://stackoverflow.com/help/someone-answers);) – tmp 2015-04-03 07:28:23

+0

我試過投票,但它說我的聲譽不夠高,所以我認爲我也無法接受答案。我不好,我必須習慣這個網站。謝謝你! – 2015-04-03 16:27:05

0
int creatLegs = 0; 
do 
{ 
    cout << "How many legs should the creature have? "; 
    cin >> creatLegs; // trying to get integer 
    if(!cin.fail())  // if cin.fail == false, then we got an int and leave loop 
     break; 
    cout << "Invalid value, try again.\n"; // else show err msg and try once more 
    cin.clear(); 
} while (1); 
+0

這不會拒絕輸入爲'1.23' – 2015-04-03 06:52:22

+0

當我輸入一個字母時會崩潰我的程序。現在我已經設置了它的方式,它會在輸入字母時發送錯誤。 – 2015-04-03 06:54:43

2

輸入可以比的整數或浮點數的表示別的東西。

記住數字不是它們的表示(一個或多個):9(十進制),017(八進制,點菜C),0b1001(二進制,點菜ocaml的),IX(羅馬符號),8+1(算術表達式), neuf(法語)都是相同數字9的表示。

所以你如果接受一個輸入像9 x,或9(與數字幾經空格),...更多一般你必須定義什麼是可以接受的輸入(如果輸入的結束來決定在是否結束,是否應該接受空格或標點符號等)。

您可以閱讀整行(例如std::getline)並使用例如sscanfstd::stol(在您使用結束指針)(其中%n控制格式是有用的,所以項目計數通過sscanf返回)解析它

還要注意的是你的問題的措辭(「一之辨int和一個double「)是錯誤的。在C++中沒有單個「int」或「double」類型(但是int是標量類型,而double是C++中的標量類型,您可以使用tagged union來定義class以保留其中任何一個)。 AFAIU,如果聲明int x;然後使用std::cin >> x;與用戶輸入12.64點和數字64它不會被解析後x將成爲12

+0

我現在只想整理一下,這樣我就能理解它是如何工作的。包括所有不同的方式來說出一個數字會更好,但由於這只是一個簡單的程序,所以我不想太深入。謝謝你。我不會放棄你在最後一部分所說的話。我不熟悉C++的編碼,如果你可以稍微低下一點,我會很感激。 – 2015-04-03 06:59:49

+0

請按照我給你的鏈接。我相信你會設法自己編碼。理解文檔是軟件開發非常重要的一部分,所以你需要學習如何閱讀文檔。玩的開心! – 2015-04-03 07:01:15

+0

非常感謝! – 2015-04-03 07:09:17

0

這個問題已經有了一個可以接受的答案,但是我會提供一個解決方案來處理所有不可分割的數字,甚至那些以浮點數表示的數字(不包含小數部分),並拒絕包含其他任何數據的輸入數字之後的空格。可接受的值

例子,這些都代表人數4:拒絕值

4 
4. 
4.0 
+4 
004.0 
400e-2 

例子:

3.999999 
4.000001 
40e-1x 
4, 
#include <iostream> 
#include <sstream> 
#include <cctype> 
#include <string> 

using namespace std; 

bool get_int(const string & input, int & i) { 
    stringstream ss(input); 
    double d; 
    bool isValid = ss >> d; 
    if (isValid) { 
     char c; 
     while(isValid && ss >> c) isValid = isspace(c); 
     if (isValid) { 
      i = static_cast<int>(d); 
      isValid = (d == static_cast<double>(i)); 
     } 
    } 
    return isValid; 
} 

int main(int argc, char *argv[]) 
{ 
    int creatLegs = 0; 
    bool validLegs = false; 

    do 
    { 
     string line; 
     do { 
      cout << "How many legs should the creature have? "; 
     } while (not getline (cin,line)); 

     validLegs = get_int(line, creatLegs); 

     if (creatLegs <= 0) 
     { 
      validLegs = false; 
     } 

     if (not validLegs) 
     { 
      cout << "Invalid value, try again." << endl; 
     } 

    } while (not validLegs); 

    cout << "Got legs! (" << creatLegs << ")" << endl; 

    return 0; 
} 

如果你想嚴格整數(no小數期,而且沒有科學計數法),然後使用這個簡單get_int功能:

bool get_int(const string & input, int & i) { 
    stringstream ss(input); 
    bool isValid = ss >> i; 
    if (isValid) { 
     char c; 
     while(isValid && ss >> c) isValid = isspace(c); 
    } 
    return isValid; 
}