ошибка сегментации присваивания символа в верхний регистр - PullRequest
4 голосов
/ 17 апреля 2011

Чтобы узнать больше о внутренней работе c ++, я решил написать свой собственный класс строк.Однако я застрял на функциях .toUpper() и .toLower().Вот мой код

Text& toUpper(){
        char* c = this->str;
        while(*c != 0, c++){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;
            }
        }
        return *this;
    }

Я выделил линию, которая вызывает ошибку сегментации, до *c = *c - 32, но я не понимаю, почему это может вызвать проблемы.Я пытался (char)(*c - 32), но это не сработало.Кроме того, это не ограничивающая проблема, потому что ничего не получается.Есть идеи?

Обновление: Мой конструктор

Text(char* str){
        this->str = str;
        this->updateLength(); // glorified strlen
    }

Определение моего указателя

private:
    char* str;
    int len;

Ответы [ 2 ]

6 голосов
/ 17 апреля 2011
while(*c != 0, c++)

Цикл while в C ++ принимает одно выражение. Он вычисляет это выражение на каждой итерации, чтобы определить, следует ли продолжать.

Здесь , является оператором запятой, а не разделителем. Оператор запятой оценивает первую часть (*c != 0), отбрасывает результат, затем оценивает вторую часть (c++) и выдает его в качестве результата.

Поскольку вы продолжали увеличивать c, условие никогда не было false, потому что c никогда не становится NULL (обратите внимание, что, как написано, оно не проверяет указанное значение, оно проверяет сам указатель).

Ваша петля будет чище, чем for петля:

for (; *c != 0; ++c)
4 голосов
/ 17 апреля 2011

Измените ваш while цикл на это:

while(*c != 0){
            if((*c >= 'a') && (*c <= 'z')){
                *c = *c - 32;                    
                std::cout << *c << std::endl;

            }
             c++; // Should be here
        }

См. Эти:

  1. Ваш код

  2. Отредактированный код .

С Wiki :

В языках программирования C и C ++ оператор запятой (представленный токеном) является двоичным оператором, который оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип). Оператор запятой имеет самый низкий приоритет по сравнению с любым оператором C и действует как точка последовательности.

...