2015-09-30 21 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。

相关问题