Segfault lors de la modification de char*
Templier Nocturne
Messages postés
7734
Date d'inscription
Statut
Membre
Dernière intervention
-
Templier Nocturne Messages postés 7734 Date d'inscription Statut Membre Dernière intervention -
Templier Nocturne Messages postés 7734 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je viens d'intégrer epitech en rentrée décalée, et je débute donc en C.
Je cherche, pour mon projet en cours (une calculatrice à nombre infinis), à réécrire la fonction str_replace qui existe en PHP.
Pour cela, je voudrais modifier ma chaine de caractères pour la première occurence de la chaine cherchée, puis recommencer tant que ma chaine de caractères source est différente de la chaine retournée en rappellant la fonction avec les nouveaux arguments qui vont bien.
Là est mon problème, je n'arrive pas à donner à ma variable d'entrée la valeur de ma variable de sortie, mon programme segfault dés que je cherche à ecrire quoi que ce soit dedans. :/
J'ai essayé d'isoler le problème, et il semblerait que je ne puisse pas appeller deux fois ma fonction de copie de contenu de variable.
Voici mon code simplifié :
Je ne comprend pas pourquoi je segfault ici, mais pas lors du premier appel de ma fonction, seulement au deuxième.
Pouvez vous m'expliquer, s'il vous plait, pourquoi ça ne fonctionne pas ?
Attention cependant, pour des raisons pédagogique, j'aimerais si possible que vous ne me donniez pas de code corrigé, j'aimerais corriger moi même. =)
Merci d'avance =)
Je viens d'intégrer epitech en rentrée décalée, et je débute donc en C.
Je cherche, pour mon projet en cours (une calculatrice à nombre infinis), à réécrire la fonction str_replace qui existe en PHP.
Pour cela, je voudrais modifier ma chaine de caractères pour la première occurence de la chaine cherchée, puis recommencer tant que ma chaine de caractères source est différente de la chaine retournée en rappellant la fonction avec les nouveaux arguments qui vont bien.
Là est mon problème, je n'arrive pas à donner à ma variable d'entrée la valeur de ma variable de sortie, mon programme segfault dés que je cherche à ecrire quoi que ce soit dedans. :/
J'ai essayé d'isoler le problème, et il semblerait que je ne puisse pas appeller deux fois ma fonction de copie de contenu de variable.
Voici mon code simplifié :
char *str_copy_str_replace(char *dest, char *src) { int x; char *out; printf("a\n"); out = src; x = 0; printf("b\n"); while (src[x] != '\0') { printf("z\n"); dest[x] = src[x]; //segfault ici x++; } dest[x] = '\0'; return (dest); } int main() { char *str0; char *str1; char *str2; str0 = "ceci est un test, un test !"; str1 = str_copy_str_replace(str1, str0); printf("%s\n", str1); str2 = str_copy_str_replace(str2, str0); // segfault ici //str_replace("un test", "plutot concluant", str1, str2); printf("%s\n", str2); }
Je ne comprend pas pourquoi je segfault ici, mais pas lors du premier appel de ma fonction, seulement au deuxième.
Pouvez vous m'expliquer, s'il vous plait, pourquoi ça ne fonctionne pas ?
Attention cependant, pour des raisons pédagogique, j'aimerais si possible que vous ne me donniez pas de code corrigé, j'aimerais corriger moi même. =)
Merci d'avance =)
A voir également:
- Segfault lors de la modification de char*
- Suivi de modification word - Guide
- Logiciel gratuit modification pdf - Guide
- Modification dns - Guide
- Coco char - Accueil - Réseaux sociaux
- Empecher la modification de cellules excel - Guide
2 réponses
Bonjour, str1 et str2 sont "vide" ces pointeurs en l'état ne peuvent pas être utilisés comme des tableaux de char.
dest[x] = src[x]; //segfault ici
dest ne pointant pas sur une adresse valide créé le segfault en voulant écrire des données " n'importe où ".
donnez une adresse valide à str1 et 2, pouvez utiliser malloc :
str1 = malloc(sizeof(char)*100);
dest[x] = src[x]; //segfault ici
dest ne pointant pas sur une adresse valide créé le segfault en voulant écrire des données " n'importe où ".
donnez une adresse valide à str1 et 2, pouvez utiliser malloc :
str1 = malloc(sizeof(char)*100);
Merci =)
En effet, avec du malloc, ça marche tout de suite mieux :)
Sait tu pourquoi ma fonction str_copy fonctionnait au premier appel quel que soit l'ordre de mes variables ?
En effet, avec du malloc, ça marche tout de suite mieux :)
Sait tu pourquoi ma fonction str_copy fonctionnait au premier appel quel que soit l'ordre de mes variables ?
Je ne sais pas normalement ça ne doit pas fonctionner du moins jusqu'à dest[x] = src[x]; arrivé là ça 'devrait' planter du premier coup.
char *str;
char *chaine = "une chaine";
maintenant si on fait :
str[4] = chaine[4];
ok pour chaine car initialisé avec une chaine de plus de 5 char, contient alors l'adresse du début de la chaine, chaine[4] retourne la valeur à l'adresse chaine+4 qu'on pourrait écrire *(chaine+4)
mais pas ok pour str qui est un pointeur non initialisé et faire str[4] c'est faire *(str+4) on va essayer de lire (enfin ici on va essayer d'ecrire) à l'adresse str+4 hors str ne contient pas une adresse valide, il peut contenir NULL ou n'importe quel valeur tant qu'il n'est pas initialisé du coup faire str[4] c'est essayez de lire quelque part où il ne faut pas et c'est pourquoi ça doit planter.
char *str;
char *chaine = "une chaine";
maintenant si on fait :
str[4] = chaine[4];
ok pour chaine car initialisé avec une chaine de plus de 5 char, contient alors l'adresse du début de la chaine, chaine[4] retourne la valeur à l'adresse chaine+4 qu'on pourrait écrire *(chaine+4)
mais pas ok pour str qui est un pointeur non initialisé et faire str[4] c'est faire *(str+4) on va essayer de lire (enfin ici on va essayer d'ecrire) à l'adresse str+4 hors str ne contient pas une adresse valide, il peut contenir NULL ou n'importe quel valeur tant qu'il n'est pas initialisé du coup faire str[4] c'est essayez de lire quelque part où il ne faut pas et c'est pourquoi ça doit planter.