[C] Remplacer un char dans une chaine de caractère

Remplacer un char dans une chaine de caractère [C] - C - Programmation

Marsh Posté le 28-03-2013 à 16:59:42    

Bonjour,
 
J'aimerais comprendre pourquoi ma fonction qui remplace un caractère une chaine de caractère ne marche pas (me renvoi "segmentation fault" ).  
 
Le code :

Code :
  1. void chng(char *buff, char old, char niu)
  2. {
  3. char *ptr;
  4. for(;;)
  5. {
  6.   ptr = strchr(buff, old);
  7.   if(ptr==NULL) break;
  8.      buff[(int)(ptr-buff)]=niu;
  9. }
  10. return;
  11. }
  12. int main(){
  13.   char * s = "looool\n";
  14.   printf("PREMIERE VERSION : %s",s);
  15.   chng(s,'\n','\0');
  16.   printf("Seconde VERSION : %s",s);
  17.   return 0;
  18. }


 
Merci d'avance.

Reply

Marsh Posté le 28-03-2013 à 16:59:42   

Reply

Marsh Posté le 28-03-2013 à 17:38:31    

Code :
  1. char * s = "looool\n";


En faisant ceci, tu déclares une chaîne immodifiable.
A la compilation, le compilo alloue la chaine "looool\n" dans une zone spéciale ("allocation statique" ), et à l'exécution, il fait pointer s sur cette zone, et si tu veux y modifier quelque chose, il y aura une "segmentation fault".
Pour ce que tu veux faire, il faut faire un truc de ce genre:
char s[8];
strcpy(s, "looool\n" );
Ici, le compilo alloue à l'exécution une zone mémoire de 8 octets sur la pile ("allocation dynamique sur la pile), et il remplit ensuite cette zone en copiant la chaîne "looool\n" dans cette zone. Comme précédemment, "looool\n" a été allouée à la compilation, dans une zone spéciale.
ou bien
char *s = malloc(8);
strcpy(s, "looool\n" );
...
free(s);
Ici, le compilo alloue à l'exécution une zone mémoire de 8 octets sur le tas ("allocation dynamique sur le tas), et il remplit ensuite cette zone en copiant la chaîne "looool\n" dans cette zone. Comme précédemment, "looool\n" a été allouée à la compilation, dans une zone spéciale.
L'allocation sur la pile à pour durée de vie le bloc ou la variable est déclarée, il y a libération automatique de la mémoire lorsqu'on en sort. Celle sur le tas a une durée de vie persistante, tant qu'on a pas libéré la mémoire avec free.
A+,


Message édité par gilou le 28-03-2013 à 17:39:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-03-2013 à 18:43:03    

Salut
Tu peux écrire aussi

Code :
  1. char s[]="looool\n"

. Tant que c'est un tableau c'est bon. Ton pb principal, comme le dit gilou, c'est que toi t'as pas défini un tableau mais un pointeur qui a alors été pointé vers une zone statique...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed