0

ゲームに適切な通貨単位を使用しようとしています。通貨は文字列として保存され (つまり、私の教授のために変更することはできません)、プラチナ、ゴールド、シルバー、銅の順になっています。たとえば、通貨を「0.1.23.15」に初期化すると、これは、プラチナが 0、ゴールドが 1、シルバーが 23、銅が 15 であることを意味します。

ただし、より高い宗派に変換できる必要があります。どういう意味ですか?例として、105 枚の銀貨 (つまり 0.0.105.0) がある場合、1 枚の金と 5 枚の銀 (つまり 0.1.5.0) として表示されるはずです。

setCost メソッド内で問題を太字にしました。数値が 100 より大きいかどうかを確認しています。そうである場合は、その列を 0 にし、前の要素に戻り、ASCII 値に 1 を追加して、適切な桁上げを行います。残念ながら、デバッガーは、単に "4" ではなく "/x4" が要素にダンプされていることを示しています。これがなぜなのか、どうすれば変更できるのか誰か知っていますか??

編集: コードを編集し、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;
}
4

3 に答える 3

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;
}
于 2013-04-05T03:50:31.000 に答える
1

問題は次の行にあると思います。

currencyBuffer[i - 1] = temp;

temp文字列 ( ) にint ( ) を代入しているため、文字currencyBuffer[i-1]化けが発生します。これは明らかに許可されています: ( C++ では整数を文字列に割り当てることができるのはなぜですか? ) int は暗黙的に char に変換でき、char は文字列に割り当てることができるためです。

または同様の関数を使用して temp を char に変換したいitoa(文字列から int を取得していたときに、逆のことを正しく行いました。atoi)。

C++ を使用しているため、これを行う簡単な方法は次のとおりです。

std::stringstream itos;
itos << temp;
currencyBuffer[i-1] = itos.c_str();
于 2013-04-05T03:28:03.213 に答える