2012-02-05 13 views
9

Sto provando a fare qualcosa di veramente semplice su C ma continuo a ricevere un errore di segmentazione. Tutto quello che voglio fare è sostituire una lettera di una parola con una lettera diversa - in questo esempio sostituire la l con una L. Qualcuno può aiutarti a spiegare dove ho sbagliato? Dovrebbe essere un problema molto semplice, penso, non ho idea del perché non funzioni.Sostituisci l'elemento di un singolo carattere di una stringa 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; 
} 

Per la mia uscita ottengo

string1 ciao
string1 [2] l
colpa Segmentation

Grazie!

+0

String1 è un puntatore alla memoria di sola lettura (nella maggior parte dei sistemi) poiché è un inizializzatore costante. Non puoi scrivere su quella stringa senza prima copiarla. – gaige

risposta

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

È can't change string literals, è un comportamento indefinito. Prova questo:

char string1[] = "hello"; 

O forse:

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

/* Stuff. */ 

free(string1); 
+0

Ok, grazie! Darò questo via. – user1163974

+0

Niente di eccezionale ma puoi usare strdup ("ciao") invece di una chiamata a malloc e strcpy. strdup fai questo per te, è più comodo usare – Zoneur

+0

@Zoneur Yup, spesso raccomando 'strdup' ma a volte è problematico perché non è standard. – cnicutar

3
char *string1; 
string1 = "hello"; 

string1 punta a una stringa letterali letterali stringa e non sono modificabili.

Quello che puoi fare è inizializzare una matrice con gli elementi di una stringa letterale.

char string1[] = "hello"; 

gli elementi della matrice string1 sono modificabili.

0
string1[2] = 'L'; 

si sta cercando di modificare una stringa letterale che è un comportamento indefinito in C. Invece utilizzare string1[]="hello"; Segmentation fault che si ottiene è perché il letterale è probabilmente immagazzinate nella sezione sola lettura della memoria e cercando di scrivere su di esso produce un comportamento indefinito.

1
char *string1 = "hello"; 

Quando si esegue il codice, la stringa letterale si troverà in una sezione di sola lettura. Il sistema operativo non consente al codice di modificare quel blocco di memoria, quindi si ottiene un errore seg.

char string1[] = "hello"; 

La stringa letterale verrà inserita nello stack quando si esegue il codice.

Problemi correlati