2013-03-20 2 views
1

Im пытается изменить строку на месте.Обратный строки в c

void reverseStr(char *str) 
{ 
int i; 
int length; 
int last_pos; 
length = strlen(str); 
last_pos = length-1; 

for(i = 0; i < length/2; i++) 
{ 
    char tmp = str[i]; 
    str[i] = str[last_pos - i]; 
    str[last_pos - i] = tmp; 
} 
} 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400893 in reverseStr (str=0x400974 "Haus") at main.c:102 
102   str[i] = str[last_pos - i]; 
(gdb) print i 
$1 = 0 
(gdb) print last_pos 
$2 = 3 
(gdb) print str 
$3 = 0x400974 "Haus" 
(gdb) print str[3] 
$4 = 115 's' 

Благодарим за понимание. Я не понимаю, как эта инструкция может вызвать ошибку? С уважением :)

+0

этот вопрос был задан много раз уже: http://stackoverflow.com/questions/11538381/reverse-strings-in-c –

+0

@cacho: Этот вопрос касается совершенно иной проблемы (с кодом, просто бывает, что хочет выполнить ту же задачу, но по-другому). Код другого вопроса не реверсируется на месте, ошибка отличается ... в основном, решение, данное здесь, совершенно не имеет значения. – cHao

+0

Правда, но моя проблема была строковым литералом, я не мог найти это с вашей ссылкой. – Zackline

ответ

5

Код в reverseStr в порядке, проблема в вызывающем коде. Вы почти наверняка передаете строчную литерал или другую доступную только для чтения память.

Скорее всего, ваш код вызова является:

char *str = "my string";//str points to a literal which cannot be modified 
reverseStr(str); 

Но вам нужно передать записываемый память. Например:

char str[] = "my string"; 
reverseStr(str); 
+0

Точно, спасибо. – Zackline

1

Вы передаете строковый литерал к своей функции. Строковые литералы не изменяемые в С.

char *p = "this string is non modifiable"; 
reverseStr(p); // undefined behavior 

Используйте массив инициализируется строкой вместо:

char p[] = "this string is modifiable"; 
reverseStr(p); // OK 
0

Это зависит от того, как вы вызываете эту функцию.

  • Если вы передаете адрес строки постоянной (определение типа {символа * ул = «String»} называются строковыми константами. Ans строковые константы помещаются в .rodata раздел в исполняемом файле), то вы получите исключение.
  • Если вы передаете адрес массива, (char arr [] = "String"), то функция будет работать.
Смежные вопросы