尝试为我的游戏使用正确的货币面额。货币存储为一个字符串(即由于我的教授而无法改变),并且按照白金,黄金,白银和铜的顺序排列。例如,如果我将我的货币初始化为“0.1.23.15”,这意味着我有0白金,1黄金,23银和15铜。
但是,我需要能够转换到更高的面额。那是什么意思?一个例子是如果我有105个银片(即0.0.105.0),它应该显示为1金和5银(即0.1.5.0)。我在setCost方法中加入了我的问题。我正在检查是否有一个大于100的数字,如果是 - 我将该列设为0,返回上一个元素并在ASCII值中加一个给出正确的进位。不幸的是,调试器显示“/ x4”被转储到元素而不是“4”。有谁知道这是为什么以及如何改变它?
编辑:编辑代码,只要您没有输入100以上的数字,它就可以正常工作。如果大脑的数字大于100,那么大脑就会失效。
这是我写过的一些最粗俗的代码。请温柔。 :(
void Potion::setCost(std::string cost)
{
char buffer[256];
std::string currencyBuffer [4];
int integerBuffer[4];
int * integerPointer = nullptr;
int temp = 0;
int i = 0;
char * tokenPtr;
//Convert string to cString
strcpy(buffer, cost.c_str() );
//Tokenize cString
tokenPtr = strtok(buffer, ".");
while(tokenPtr != nullptr)
{
//Convert ASCII to integer
temp = atoi(tokenPtr);
//Store temp into currency buffer
integerBuffer[i] = temp;
//Make pointer point to integer buffer
integerPointer = &integerBuffer[i];
if(*integerPointer < 100)
currencyBuffer[i] = tokenPtr;
else
{
//Store zero in column if number is
//greater than 100
temp2 = temp % 100;
itoa(temp2, temp3, 10);
currencyBuffer[i] = temp3;
//Go back and add one to currency buffer
temp = atoi(currencyBuffer[i-1].c_str());
temp += 1;
itoa(temp, temp3, 10);
currencyBuffer[i - 1] = temp3;
}
i++;
//Get next token
tokenPtr = strtok(nullptr, ".");
}
NewLine();
std::string tempBuffer;
//Store entire worth of potions
tempBuffer = "Platinum: ";
tempBuffer += currencyBuffer[0];
tempBuffer += "\nGold: ";
tempBuffer += currencyBuffer[1];
tempBuffer += "\nSilver: ";
tempBuffer += currencyBuffer[2];
tempBuffer += "\nCopper: ";
tempBuffer += currencyBuffer[3];
mCost = tempBuffer;
}
答案 0 :(得分:1)
我认为问题出在这一行:
currencyBuffer[i - 1] = temp;
您将int(temp
)分配给字符串(currencyBuffer[i-1]
),这会导致写入垃圾字符。这显然是允许的:
(Why does C++ allow an integer to be assigned to a string?)
因为int可以隐式转换为chars,chars可以分配给字符串,。
你想使用itoa
或类似函数将temp转换为char(当你从字符串中获取int时,你已经正确地执行了相反的操作,atoi)。
由于你使用的是C ++,一个简单的方法是:
std::stringstream itos;
itos << temp;
currencyBuffer[i-1] = itos.c_str();
答案 1 :(得分:1)
不确定这是否只是我在这里(我的C ++日子可以追溯到大约13年),而你的老师最适合回答你,但感觉就像你在做什么/你是怎么做的处理器非常密集。从技术上讲,你可能最好将整个字符串拆分成一个字符串数组,然后使用它们来确定你的最终计数:
std::string str = "I.have.a.dog";
//replace all DOTS with SPACES for next use
for (int i = 0; i < str.length(); ++i) {
if (str[i] == '.')
str[i] = ' ';
}
std::istringstream stm(str) ;
string word ;
while( stm >> word ) // read white-space delimited tokens one by one
{
// put word into array
}
从那里开始,你有一个带有正确文本/单词的数组到一个数组中,你可以用它来做你的计算......只是想一想......不要引用我的话;)
答案 2 :(得分:1)
这是我创建的用于解析您的号码的功能。对于大于...的数字没有问题。如果您希望使用它=)
unsigned long int str2cur(std::string cost)
{
unsigned long int money = 0;
//given that there are always 4 segments
int end;
do
{
end = cost.find('.', 0);
money = money * 100 + atoi(cost.substr(0, end).c_str());
cost.erase(0, end + 1);
}
while (end != std::string::npos);
return money;
}