Fonction qui modifie un char *

Fonction qui modifie un char * - C - Programmation

Marsh Posté le 13-10-2005 à 08:32:12    

Salut,
 
à force de faire des langages de script interprétés, j'en ai perdu mon C :/
Donc voilà le problème, j'ai besoin d'avoir une fonction a qui on passe une chaine de caractères, et que cette fonction modifie la chaine :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void pouet (char* string, int size) {
  4. int i;
  5. for (i = 0; i < size; i++) {
  6.  printf("-> %c\n", string[i]);
  7.  string[i] = 60; // par exemple hein
  8. }
  9. }
  10. int main (int argc, char *argv[]) {
  11. char* pouet_str = "pouetpouet";
  12. printf("%s\n", pouet_str);
  13. pouet(pouet_str, strlen(pouet_str));
  14. printf("%s\n", pouet_str);
  15. return 0;
  16. }


 
Voilà ce que ça me sort :

sh-3.00$ gcc -o test test.c  
sh-3.00$ ./test  
pouetpouet
-> p
Erreur de segmentation
sh-3.00$


 
Bref, ça segfault dès que j'essaie de modifier sintrg[i], et j'avoue ne pas comprendre pourquoi.
 
Si on pouvait m'expliquer [:romf]

Reply

Marsh Posté le 13-10-2005 à 08:32:12   

Reply

Marsh Posté le 13-10-2005 à 09:48:39    

ton char * pointe sur une zone mémoire sur lesquelles tu n'as pas les droits en écriture ?

Reply

Marsh Posté le 13-10-2005 à 10:06:42    

multani a écrit :


Donc voilà le problème, j'ai besoin d'avoir une fonction a qui on passe une chaine de caractères, et que cette fonction modifie la chaine :

int main (int argc, char *argv[])  
{
 char* pouet_str = "pouetpouet";
 return 0;
}


Voilà ce que ça me sort :

sh-3.00$ gcc -o test test.c  
sh-3.00$ ./test  
pouetpouet
-> p
Erreur de segmentation
sh-3.00$


 
Bref, ça segfault dès que j'essaie de modifier sintrg[i], et j'avoue ne pas comprendre pourquoi.


Le langage C ne garanti pas qu'une chaine de caractère littérale soit modifiable. Tenter de la modifier invoque un comportement indéfini. En d'autres termes, c'est un bug.

char* pouet_str = "pouetpouet";


devrait plutôt s'écrire

char const * pouet_str = "pouetpouet";


ce qui permet au compilateur de générer au moins des avertissements...
 
Si tu veux modifier la chaine, il faut utiliser un tableau de char.

char pouet_str[] = "pouetpouet";



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-10-2005 à 10:41:26    

Emmanuel Delahaye a écrit :

Le langage C ne garanti pas qu'une chaine de caractère littérale soit modifiable. Tenter de la modifier invoque un comportement indéfini. En d'autres termes, c'est un bug.

char* pouet_str = "pouetpouet";


devrait plutôt s'écrire

char const * pouet_str = "pouetpouet";


ce qui permet au compilateur de générer au moins des avertissements...


D'accord, le compilateur prends la chaine comme un const alors. Je pensais à un truc du genre, mais j'étais pas sur :jap:

Emmanuel Delahaye a écrit :


Si tu veux modifier la chaine, il faut utiliser un tableau de char.

char pouet_str[] = "pouetpouet";



J'avais vu quand passant un tableau de char, ça marchait mieux effectivement.
 
Ok, merci de la précision, je vais pouvoir me démerder maintenant :jap:

Reply

Marsh Posté le 14-10-2005 à 15:34:56    

et un ptit malloc sur le char * avant d'écrire dedans ?  

Reply

Marsh Posté le 14-10-2005 à 15:40:57    

ptc07 a écrit :

et un ptit malloc sur le char * avant d'écrire dedans ?

Oui, on peut toujours faire plus compliqué...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-10-2005 à 15:41:51    

Reply

Marsh Posté le 14-10-2005 à 15:42:45    

ptc07 a écrit :

et un ptit malloc sur le char * avant d'écrire dedans ?


 
Oui, j'ai testé, et ça marche aussi :)


Message édité par multani le 14-10-2005 à 15:43:10
Reply

Marsh Posté le 14-10-2005 à 16:41:59    


 
Rapport entre memset() et le problème présent ?  [:atlantis]

Reply

Marsh Posté le 14-10-2005 à 16:59:03    

Elmoricq a écrit :

Rapport entre memset() et le problème présent ?  [:atlantis]


Pour faire encore plus compliqué ? [:petrus75]

Reply

Sujets relatifs:

Leave a Replay

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