2015-09-30 25 views
1

我想製作一個程序來玩撲克。當下注玩家應該輸入一個整數作爲他們的新注。爲防止有人錯誤輸入字符串時發生錯誤,該代碼旨在輸入字符串,檢查它是否是數字,如果不是,則請求玩家輸入有效的下注。使用istringstream()來區分「0」和非數字字符串

以下代碼是我嘗試使用istringstream函數將字符串betstring轉換爲int的函數。

如果字符串中沒有數字,istringstream返回0。 betstring是一個無效的條目,如果它是一個小於0的數字或者它不包含數字。如果比特串是「0」,這是一個有效的賭注。

如果betstring是混合的字母和數字(例如j96kp),那麼這個「j96kp」被假定爲表示爲了簡化而下注96,所以它是有效的。

問題出在我輸入一個等於「0」的betstring時。該代碼將其解釋爲無效投注。我檢查了邏輯運算符,我不明白爲什麼代碼不會將「0」作爲有效投注。

任何人都可以發現問題出現的地方嗎?

#include <stdlib.h> 
#include <stdio.h> 
#include <sstream> 
#include <string> 

using namespace std; 

int requestBet() 
{ 
    int newbet; 
    string betstring; 
    int validbet = 0; 
    while(!validbet) 
    { //loop until a valid bet is entered 
     cin >> betstring; 
     validbet = 1; //assume bet is valid then test this 
     istringstream(betstring) >> newbet; 
     if(((newbet == 0) && (betstring.at(0) != 0)) || (newbet < 0)) 
     { 
      cout << "Enter a valid bet" << endl; 
      validbet = 0; 
     } 
    } 
    return newbet; 
} 

int main() 
{ 
    int number; 
    cout << "Enter your bet" << endl; 
    number = requestBet(); 
    return 0; 
} 

回答

0

betstring.at(0) != 0不會做你可能期望它做的事。你想比較字符,也就是看第一個字符是否是'0',所以你必須把它放在那裏。實際上,您的代碼會查看第一個char的數值是否爲零(即'\ 0')。

+0

謝謝,這正是問題所在!我會在幾分鐘內「接受」這個答案 – Hugh

0

...玩家應該輸入一個整數作爲他們的新賭注。爲防止有人錯誤輸入字符串時發生錯誤,該代碼旨在輸入字符串,檢查它是否是數字,如果不是,則請求玩家輸入有效的下注。

下面的東西會適用於你。

template <class T> 
T StringToValue(const std::string& str) { 
    std::istringstream iss(str); 
    T value; iss >> value; 

    // Use fail(), not bad() 
    if (iss.fail()) 
     throw std::runtime_error("'" + str +"' is not a value"); 

    return value; 
} 

你可以用它喜歡:

string betstring; 
cin >> betstring; 

int bet; 
bet = StringToValue<int>(betstring); 

如果字符串不是T型(intfloat等)的演示文稿,然後runtime_error被拋出。

如果您切換到bad(),那麼函數在遇到可能在fail()下拋出的東西時將返回0。

相關問題