Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1352 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2183013
Raikyn
Posté le 28-03-2013 à 16:59:42  profilanswer
 

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.

mood
Publicité
Posté le 28-03-2013 à 16:59:42  profilanswer
 

n°2183020
gilou
Modérateur
Modzilla
Posté le 28-03-2013 à 17:38:31  profilanswer
 

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é!  --
n°2183046
Sve@r
Posté le 28-03-2013 à 18:43:03  profilanswer
 

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...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
langage C - PB unsigned charlangage C
[VBA] Savoir si n'importe quel caractère défini est plusieurs fois...C++ - Cplex problem de variable dans une boucle for & random
[Objective C][Cocoa] Détecter si un host est accessible[C#] Trier un tableau d'objet
Macro rechercher remplacer [Résolu]Chaine de caractère entre dièse inattendu
Plus de sujets relatifs à : [C] Remplacer un char dans une chaine de caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR