Оператор bigint ›› перегрузка

Вот мой код для перегрузки оператора>>. Предполагается доводить числа до точки с запятой и помещать их в bigint.

std::istream& operator>>(std::istream& is, bigint& bi) {

    int i = 0;
    char ch;
    char temp[SIZE];

    // grabs the first character in the file
    is >> ch;
    temp[i] = ch;
    ++i;

    // while loop grabs the rest of the characters
    // up to the semicolon
    while(ch != ';') {
        is >> ch;
        temp[i] = ch;
        ++i;
    }

    // temp is stored in the bigint ref
    bi = bigint(temp);

    return is;
}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю ее, она дает мне дополнительный вывод. Например: когда я набираю "34;" в качестве входных данных результирующий bigint будет "3411". Может ли кто-нибудь сказать мне, что я делаю неправильно?


person uberpirate    schedule 02.10.2013    source источник
comment
Поможет SSCCE.   -  person chris    schedule 02.10.2013


Ответы (2)


Вы не завершаете свою строку temp нулем. Добавь это:

temp[i - 1] = '\0';
bi = bigint(temp);

Обратите внимание, что -1 удалит точку с запятой, которая вам, вероятно, тоже не нужна. Если вы хотите сохранить точку с запятой по какой-либо причине, измените ее на temp[i].

Вы также должны добавить проверку в свой цикл while, чтобы убедиться, что вы не переполняете размер буфера.

person Jonathan Potter    schedule 02.10.2013

Вы гарантируете, что точка с запятой стоит в temp в конце. Точка с запятой, вероятно, искажает любой анализ, который bigint делает с этой строкой. Измените цикл для проверки точки с запятой перед ее вставкой в ​​temp:

std::istream& operator>>(std::istream& is, bigint& bi)
{
    char temp[SIZE] = {}; // zero out the array so the end is null terminated
    char c;

    for(int i = 0; i < SIZE-1 && is >> c && c != ';'; ++i)
    {
        temp[i] = c;
    }

    bi = bigint(temp);
    return is;
}
person David    schedule 02.10.2013