2012-03-31 2 views
-2

Можно создать дубликат:
How to reverse a string in place in c using pointers?Как правильно свернуть строку?

Я пытался изменить строку с помощью C. происходит ошибка сегментации. Любая идея почему?

Вот мой код:

#include <stdio.h> 
    #include <string.h> 

    int main(void) 
    { 
    char *str1 = "abbd"; 
    char *str2; 


    str2 = str2 + strlen(str1)-1; 

    while(*str1 != '\0') 
    *(str2--) = *(str1++); 


    printf("%s", str2); 

    return 0; 
    } 
+0

Даже если вы обнаружите ошибку сегментации, она не изменит строку. Можете ли вы понять, почему? – kindall

+0

Даже если вы исправите ошибку, которую все указали на вас, невозможно изменить вашу строку на месте, потому что эта строка не модифицируется. Вы не можете изменять строковые литералы. –

ответ

0

Ничего не выделено должным образом (назначьте правильную длину при объявлении или malloc it), и вы действительно не перемещаетесь по строкам и не проверяете окончание вашего условия как установлено (попробуйте str [i]). Вы разбудили кракена.

0

Похоже, вы не выделить никакого места для str2, только что сделал указатель.

0
char *str2; 
str2 = str2 + strlen(str1)-1; 

Вы объявили указатель str2, но инициализировать его значение для мусора. (str2 + ...)

Вы пытаетесь сделать модификацию на месте? Это не будет работать для этого кода, формат char *foo="bar"; помещает "bar" в защищенное от записи место на платформах, которые его поддерживают.

Вы пытаетесь сделать замену на месте? Если это так, вы забыли выделить это пространство.

0

Вы не выделяете память для str2.

str2 = (char *)malloc(sizeof(char) * (strlen(str1) + 1)); 

Я не пробовал, но мне кажется, что вы будете хотеть установить str2 = str2 + STRLEN (str1), в противном случае я думаю, что вы будете бежать «фронт» вашего str2 буфер.

Я бы рекомендовал обрабатывать ваши строки как массивы, и пусть компилятор выполнит арифметику указателя для вас.

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