我正在尝试制作一个玩扑克的程序。投注时,玩家应输入一个整数作为新的投注。为了防止有人输入错误并输入字符串时出现错误,代码打算接受字符串,检查它是否为数字,如果不是,则要求玩家输入有效的赌注。
下面的代码是我尝试使用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))
答案 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
类型(int
,float
等)的演示文稿,则会抛出runtime_error
。
如果切换到bad()
,那么当遇到fail()
下的某些内容时,该函数将返回0。