Запись данных в свойство класса

319
11 февраля 2017, 07:47
class BigInt
{
  private:
    static const int max_length = 300;
    int c;
    int number[max_length];
    int to_int(char symbol)
    {
        return (symbol >= '0' && symbol <= '9') ? (int)symbol - '0' : -1;
    }
  public:
    BigInt(char* str)
    {
        c = strlen(str) - 1;
        int pos = 0;
        if (c > max_length)
        {
            cout << "Max length is " << max_length << "but your number has length"
                 << c << endl;
            return;
        }
        for (int i = c; i <= 0; i--)
        {
            number[pos] = to_int(str[i]);
            pos++;
        }
    }
    void printNumber(void)
    {
        for (int i = c; i >= 0; i--)
        {
            cout << number[i];
        }
        cout << "\n";
    }
};

Есть конструктор, который принимает строку-число, цифры которого записывает в массив number. При выводе данного массива получаю почему-то рандомные значения.

int main(void)
    {
        char str[]="111111111";
        BigInt test(str);
        test.printNumber();
        return 0;
    }
Answer 1
for(int i = c;i<=0;i--)

Ну, т.е. пока i не больше нуля, то...

Условие вы поставили неверное.

Я бы вообще переписал ваш код так:

class BigInt
{
private:
    static const int max_length = 300;
    int number[max_length];
    unsigned int c;
    static int to_int(char symbol)
    {
        if (symbol < '0' || symbol > '9') throw exception("Wrong input");
        return symbol - '0';
    }
public:
    BigInt(const char * str)
    {
        c = strlen(str);
        if (c > max_length) throw exception("Wrong length");
        for(unsigned int i = 0; i < c; ++i)
        {
            number[i] = to_int(str[c-i-1]);
        }
    }
    void printNumber(void)
    {
        for(int i = c-1; i >= 0; i--)
        {
            cout<<number[i];
        }
        cout<<"\n";
    }
};

И еще - имя c для переменной, которая должна что-то означать в классе - не годится. Это имя для локальной переменной цикла, например... но не для длины числа.

Answer 2
c = strlen(str) - 1;

Зачем вы вычитаете 1? Длина она и есть длина, не надо.

for(int i = c;i>=0;i--)

<= допустим, что опечатка.
Да, не опечатка, а ошибка... =)

Как-то так:

BigInt(char * str){
    c = strlen(str);
    int pos=0;
    if(c > max_length){
        cout<<"Max length is "<<max_length<<"but your number has length"<<c<<endl;
        return;
    }
    for(int i = 0; i < c; i++){
        number[pos] = to_int(str[i]);
        pos++;
    }
}
void printNumber(void){
    for(int i = 0; i < c; i++){
        cout<<number[i]<<"\n";
    }
    cout<<"\n";
}
READ ALSO
Использование boost::bind() и shared_from_this()

Использование boost::bind() и shared_from_this()

В примере асинхронного tcp-сервера на бусте связывается функция (все это происходит в классе, наследующим enable_shared_from_this):

358
алгоритм std::move

алгоритм std::move

Испортит ли эта инструкция данные в файле?

300