使用 istringstream() 区分"0"和非数字字符串

Using istringstream() to distinguish between "0" and non-numerical string

本文关键字:数字 数字字符 字符串 区分 使用 istringstream      更新时间:2023-10-16

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

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

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

istringstream返回0。如果Betstring是小于0的数字或不包含数字,则该条目无效。如果betstring为"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;
}

betstring.at(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;   
}

你可以这样使用:

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

如果字符串不是T类型的表示(int, float等),则抛出runtime_error

如果您切换到bad(),那么当遇到fail()下会抛出的东西时,该函数将返回0。