2013-07-17 2 views
2

У меня есть следующие простые функции:обратная функция для полукокса * метания ошибки сегментации

void reverse(char* str) { 
    if (str == NULL) 
     return; 
    char* end = str; 
    while(*end != NULL) { 
     end++; 
    } 
    end--; 
    while(str < end){ 
     char temp = *str; 
     *str++ = *end; 
     *end-- = temp; 
    } 
} 

int main(int argc, char* argv[]) { 
    char* second = "SOMETHING\0"; 
    cout << "Before Reverse String: " << second << '\n'; 
    reverse(second); 
    cout << "Reverse String: " << second << '\n'; 
} 

просто, правда? однако я получаю ошибку сегментации в строках

*str++ = *end 
*end-- = temp 

Что мне не хватает?

Спасибо!

+5

Вы изменяете строковым что неопределенное поведение. –

+0

см. [Обратный массив символов] (http://www.cplusplus.com/forum/general/14951/) –

+1

Это недопустимо C++ 11, поскольку вы не можете иметь неконстантный 'char *' для строковый литерал, и вы должны получить предупреждение об этом независимо. Пожалуйста, прислушайтесь к предупреждениям или включите их, а затем сделайте это. – chris

ответ

0

Вы изменяете строковый литерал:

char* second = "SOMETHING\0"; 

что неопределенное поведение, одно решение было бы, чтобы присвоить литерал массив символов:

char second[] = "SOMETHING"; 

Кроме того, строковые литералы будет NULL прекращено , поэтому не нужно добавлять \0. Вы также должны изменить свой цикл while для сравнения с \0 вместо NULL. Хотя, он должен работать, так как они оба будут вычисляться 0, поскольку *end является char он читает лучше использовать \0:

while(*end != '\0') 
+0

Насколько я знаю, 'NULL' должен оцениваться в 0, а' '\ 0'' должен иметь значение 0. Это определенно намного яснее, чем' NULL'. – chris

+0

@chris Оба 'g ++' и 'clang ++' предупреждают что-то похожее на 'сравнение между NULL и non-pointer ('char' и NULL)', и хотя это должно работать нормально, я думаю, что использование '\ 0' читается лучше. Поправлено более конкретно. –

+0

Это тоже. Предупреждения никогда не бывают приятными, когда их легко избавиться. – chris

0

Изменить

char* second = "SOMETHING\0"; 

К

char second[] = "SOMETHING"; 

Примечание: строковые литералы не могут быть изменены, и вы не должны явно добавить \0 в строковый литерал.

while(*end != NULL) { 

должен быть

while(*end != '\0') { 

NULL используется только для нулевого указателя.

Смежные вопросы