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

时间:2015-09-30 21:14:36

标签: c++ string

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

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

如果字符串中没有数字,则

istringstream返回0。如果betstring是小于0的数字或者它不包含数字,则betstring是无效条目。如果betstring为“0”,这是一个有效的赌注。

如果betstring是字母和数字混合(例如j96kp),那么假设这个“j96kp”表示为了简单而下注为96,这是有效的。

当我输入等于“0”的betstring时会出现问题。该代码将此解释为无效赌注。我检查了逻辑运算符,我不明白为什么代码不会将“0”作为有效的赌注。

有人能发现问题出现的地方吗?

DECLARE @Date DATE = GETDATE(),
        @TinyDate TinyInt

SELECT @TinyDate = CONVERT(TINYINT,DATEPART(WEEKDAY, @Date))

2 个答案:

答案 0 :(得分:0)

betstring.at(0) != 0没有做你可能期望的事情。您想要比较字符,即查看第一个字符是否为'0',因此您必须将其放在那里。实际上,你的代码会看到第一个char的数值是否为零(这将是' \ 0')。

答案 1 :(得分: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。