C++ 使用istringstream()来区分;0“;和非数字字符串
我正在尝试制作一个玩扑克的程序。下注时,玩家应输入一个整数作为其新下注。为了防止当有人输入错误的字符串时出现错误,请检查该代码是否是一个数字,如果不是,请要求玩家输入一个有效的赌注 下面的代码是我尝试使用istringstream函数将字符串betstring转换为int来创建一个函数 如果字符串中没有数字,则istringstream返回0。如果betstring是小于0的数字或不包含任何数字,则它是无效项。如果下注字符串为“0”,则这是有效的下注 如果下注字符串是字母和数字的混合体(例如j96kp),那么为了简单起见,假设该“j96kp”表示下注96,因此它是有效的 当我输入一个等于“0”的下注字符串时,问题就出现了。代码将此解释为无效下注。我已经检查了逻辑运算符,我不明白为什么代码不接受“0”作为有效赌注 有人能指出问题出在哪里吗C++ 使用istringstream()来区分;0“;和非数字字符串,c++,string,C++,String,我正在尝试制作一个玩扑克的程序。下注时,玩家应输入一个整数作为其新下注。为了防止当有人输入错误的字符串时出现错误,请检查该代码是否是一个数字,如果不是,请要求玩家输入一个有效的赌注 下面的代码是我尝试使用istringstream函数将字符串betstring转换为int来创建一个函数 如果字符串中没有数字,则istringstream返回0。如果betstring是小于0的数字或不包含任何数字,则它是无效项。如果下注字符串为“0”,则这是有效的下注 如果下注字符串是字母和数字的混合体(例如j9
#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))
{
coutbetstring.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。谢谢,这正是问题所在!我将在几分钟内“接受”此答案谢谢,这正是问题所在!我将在几分钟内“接受”此答案