2015-07-26 2 views
0

Итак, я просто хочу знать, почему моя программа продолжает сбой, все, что я пытаюсь сделать, - это цикл через указатель на массив символов и заменить старый символ новым и вернуть много раз я заменил его:замещающий символ в указателе на массив символов

int main(void) { 
    char *s = "hello";  
    printf("%lu\n",str_replace_all(s,'e','f')); 
    printf("%s",s); 
    return 0; 
} 

size_t str_replace_all(char *s,int oldc,int newc) { 
    size_t count = 0; 
    for(;*s != '\0'; s++) { 
     if(*s == oldc) { 
     *s = newc; 
     count++ 
    } 
} 
    return count; 
} 

Это нормально компилируется с gcc -ansi -W -Wall -pedantic, но когда я запускаю его он падает с этим: Segmentation fault (core dumped) Мне нужно помочь выяснить, что происходит, спасибо!

P.S ожидается выход был hfllo

+0

@Manish Mallavarapu Примите во внимание, что вы должны объявить функцию перед ее вызовом, например, перед основным и включить заголовок stdio.h –

ответ

3

Вы пытаетесь изменить буквенную строку, которая производит неопределенное поведение. Измените объявление на:

char s[] = "hello"; 
+0

спасибо! это было простое решение –

+0

Является ли неподтвержденное поведение, потому что строковый литерал является const-типом? – Tahlil

+2

@Tahlil In Строковые литералы имеют типы непостоянных массивов символов. Тем не менее C-стандарт не позволяет изменять строковые литералы. В C++ строковые литералы действительно имеют типы постоянных массивов символов. –

0

Причина, почему вы получаете ошибку сегментации является то, что нет памяти, выделенной для переменной х. Это просто указатель, указывающий на какое-то местоположение адреса. Возможным решением является char s [] = «привет» или вы можете выделить некоторую память в куче, memcpy или strcpy «hello» для указателя char. Тогда код будет работать. Надеюсь, он очистит концепцию. :)

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