2012-02-05 20 views
9

Próbuję zrobić coś naprawdę podstawowego na C, ale wciąż dostaję błąd segmentacji. Wszystko, co chcę zrobić, to zastąpić literę słowa inną literą - w tym przykładzie zastąp L literą L. Czy ktoś może pomóc ci wyjaśnić, gdzie się nie udałem? Powinien to być naprawdę podstawowy problem, po prostu nie mam pojęcia, dlaczego nie działa.Zastąpienie pojedynczego elementu znaku ciąg C

#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char *string1; 

    string1 = "hello"; 
    printf("string1 %s\n", string1);  

    printf("string1[2] %c\n", string1[2]); 
    string1[2] = 'L'; 
    printf("string1 %s\n", string1); 

    return 0; 
} 

Na moim wyjściu uzyskać

łańcuch1 cześć
łańcuch1 [2] l
wina Segmentacja

Dzięki!

+0

Łańcuch1 jest wskaźnikiem do pamięci tylko do odczytu (w większości systemów), ponieważ jest to stały inicjator. Nie możesz pisać do tego ciągu bez uprzedniego skopiowania go. – gaige

Odpowiedz

14
string1 = "hello"; 
string1[2] = 'L'; 

Ty can't change string literals, to niezdefiniowane zachowanie. Spróbuj tego:

char string1[] = "hello"; 

czy może:

char *string1; 
string1 = malloc(6); /* hello + 0-terminator */ 
strcpy(string1, "hello"); 

/* Stuff. */ 

free(string1); 
+0

Ok- dziękuję! Dam ci to. – user1163974

+0

Nic wielkiego, ale możesz użyć strdup ("hello") zamiast wywołania malloc i strcpy. Strdup zrobi to za ciebie, wygodniej będzie użyć – Zoneur

+0

@Zoneur Yup, często polecam 'strdup' ale czasami jest to problematyczne, ponieważ nie jest standardem. – cnicutar

3
char *string1; 
string1 = "hello"; 

string1 punktów na ciąg dosłownym i literały łańcuchowe są niemodyfikowalne.

Co można zrobić, to zainicjować tablicę z elementami ciągu literowego.

char string1[] = "hello"; 

elementy z tablicy string1 są modyfikowalne.

0
string1[2] = 'L'; 

próbujesz zmienić ciąg dosłowne których zachowanie jest niezdefiniowane w C. Zamiast używać string1[]="hello"; wina Segmentacja masz jest ponieważ dosłowne jest prawdopodobnie przechowywane w sekcji odczytywanej tylko pamięci i próbuje zapis do niej powoduje niezdefiniowane zachowanie.

1
char *string1 = "hello"; 

Po uruchomieniu kodu literał łańcuchowy będzie w sekcji, która jest tylko do odczytu. System operacyjny nie pozwala, aby kod zmienił ten blok pamięci, więc otrzymujesz błąd seg.

char string1[] = "hello"; 

Literał ciągu zostanie naciśnięty na stos po uruchomieniu kodu.

Powiązane problemy