2013-10-02 2 views
0

Вот мой код для моего оператора >> перегрузка. Предполагается, что они будут принимать цифры до точки с запятой и помещать их в 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». Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

[SSCCE] (http://sscce.org) поможет. – chris

ответ

0

Вы не нулевой оконечные вашу строки temp. Добавьте это:

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

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

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

0

Вы гарантируете, что точка с запятой находится в 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; 
} 
Смежные вопросы