C++ 使用istringstream()来区分;0“;和非数字字符串

C++ 使用istringstream()来区分;0“;和非数字字符串,c++,string,C++,String,我正在尝试制作一个玩扑克的程序。下注时,玩家应输入一个整数作为其新下注。为了防止当有人输入错误的字符串时出现错误,请检查该代码是否是一个数字,如果不是,请要求玩家输入一个有效的赌注 下面的代码是我尝试使用istringstream函数将字符串betstring转换为int来创建一个函数 如果字符串中没有数字,则istringstream返回0。如果betstring是小于0的数字或不包含任何数字,则它是无效项。如果下注字符串为“0”,则这是有效的下注 如果下注字符串是字母和数字的混合体(例如j9

我正在尝试制作一个玩扑克的程序。下注时,玩家应输入一个整数作为其新下注。为了防止当有人输入错误的字符串时出现错误,请检查该代码是否是一个数字,如果不是,请要求玩家输入一个有效的赌注

下面的代码是我尝试使用istringstream函数将字符串betstring转换为int来创建一个函数

如果字符串中没有数字,则istringstream返回0。如果betstring是小于0的数字或不包含任何数字,则它是无效项。如果下注字符串为“0”,则这是有效的下注

如果下注字符串是字母和数字的混合体(例如j96kp),那么为了简单起见,假设该“j96kp”表示下注96,因此它是有效的

当我输入一个等于“0”的下注字符串时,问题就出现了。代码将此解释为无效下注。我已经检查了逻辑运算符,我不明白为什么代码不接受“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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int requestBet()
{
内特纽贝;
字符串下注字符串;
int validbet=0;
而(!validbet)
{//循环,直到输入有效的赌注
cin>>贝特林;
validbet=1;//假设赌注有效,然后测试此值
istringstream(betstring)>>newbet;
如果((newbet==0)和&(betstring.at(0)!=0))| |(newbet<0))
{
cout
betstring.at(0)!=0
没有达到您可能期望的效果。您希望比较字符,即,查看第一个字符是否为
'0'
,因此必须将其放在那里。因此,您的代码会查看第一个字符的数值是否为零(即'\0')。

betstring.at(0)!=0
没有达到您可能期望的效果。您需要比较字符,也就是说,查看第一个字符是否为
'0'
,因此必须将其放在那里。因此,您的代码会查看第一个字符是否具有数值零(即'\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;   
}
模板
T StringToValue(常量std::string和str){
标准:istringstream iss(str);
T值;iss>>值;
//使用fail(),不错()
if(iss.fail())
throw std::runtime_error(“'”+str+“'不是值”);
返回值;
}
您可以像这样使用它:

string betstring;
cin >> betstring;

int bet;
bet = StringToValue<int>(betstring);
string-betstring;
cin>>贝特林;
int-bet;
bet=StringToValue(betstring);
如果字符串不是类型为
T
int
float
等)的表示形式,则抛出
运行时错误

如果切换到
bad()

…玩家应输入一个整数作为其新赌注。为防止在有人错误键入和输入字符串时出错,代码旨在输入字符串,请检查该代码是否为数字,如果不是,请要求玩家输入有效赌注

下面这样的东西对你有用

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;   
}
模板
T StringToValue(常量std::string和str){
标准:istringstream iss(str);
T值;iss>>值;
//使用fail(),不错()
if(iss.fail())
throw std::runtime_error(“'”+str+“'不是值”);
返回值;
}
您可以像这样使用它:

string betstring;
cin >> betstring;

int bet;
bet = StringToValue<int>(betstring);
string-betstring;
cin>>贝特林;
int-bet;
bet=StringToValue(betstring);
如果字符串不是类型为
T
int
float
等)的表示形式,则抛出
运行时错误


如果您切换到
bad()
,那么当函数遇到将在
fail()

下抛出的内容时,它将返回0。谢谢,这正是问题所在!我将在几分钟内“接受”此答案谢谢,这正是问题所在!我将在几分钟内“接受”此答案