2

I feel like I'm missing something obvious and I can't figure it out. Basically, it seems the information is correctly being stored in the first for loop. But when I go to print it out in the second for loop its only garbage values. What am I missing? I'm relatively new to this

bignum::bignum(const string &digits)
{
    int length = digits.length();
    ndigits = 0;    

    for (int i = 0; i < length; i++)
    {
        if(isdigit(digits[i]))
        {
            ndigits++;
            digit = new int[ndigits];
            int tmpInt = digits[i] - '0';
            digit[i] = tmpInt;
        }
        if(isalpha(digits[i]))
        {
            break;
        }
        cout <<"step "<< i << " " << digit[i] << endl;
    }

    for (int i = 0; i < ndigits; i++)
    {
        cout << digit[i] << " ";
    }
    cout << endl;
    cout << "digits" << ndigits << endl;
    cout << endl;
}
4

3 に答える 3

0

より多くの数値を取得するにつれて配列のサイズを変更したい場合は、これを試してください。このバージョンには、最初は 10 の余地があり、11 番になると 10 ずつサイズが大きくなります。新しい配列が作成され、古いデータがコピーされます。古い数字配列が削除され、そのポインターが新しいバージョンに置き換えられます。

この方法は場合によっては遅くなる可能性がありますが (古いデータがいっぱいになったときに新しい大きなデータにコピーするため)、通常は 10 桁未満であれば問題ありません。通常 10 を超える場合は、最初の数を大きくしてください。

int digits_max = 10;
int digits_pos = 0;
int *digit = new int[digits_max];

...

if(isdigit(digits[i])) {
    if (digits_pos == digits_max) {
        int new_max = digits_max + 10;
        int *digit_tmp = new int[new_max];

        // Copy from old array to new
        for (int i = 0; i < digits_max; i++) {
            digit_tmp[i] = digit[i];
        }

        delete[] digit; // Free old memory, or your RAM gets full

        digit = digit_tmp;
        digits_max = new_max;
    }
}
else { // Always break if not int
    break;
}

int tmpInt = digits[i] - '0';
digit[digits_pos] = tmpInt;
digits_pos++;

終了する前に (または数字配列の使用が終了したら)、削除する必要があります。

delete[] digit;

編集: digits_pos++ をループの最後に移動しました。最後のバージョンは間違っていました。

于 2013-10-16T15:02:56.820 に答える