modifier une chaîne de caractères dans une fonction void
Bonjour à tous, et bonne année à tous.
Je m'adresse à vous car j'ai un petit souci avec une fonction, voici d'abord une version de ma fonction qui marche très bien et qui fait ce j'attend d'elle, c'est-à-dire supprimer les doublons dans une chaîne de caractère passée en paramètre un peu comme l'outil "tr" sous linux, donc si par exemple je lu donne la chaîne "bonne annnee" elle me renvoie "bone ane":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| char* SupprimerDoublon(char *chaine, char lettre)
{
char *tab = malloc(sizeof(char) * strlen(chaine));
if(!tab) exit(-1);
int i = 0, j = 0;
while(chaine[i] != '\0')
{
if(chaine[i] == lettre)
{
tab[j] = chaine[i];
for(;chaine[i] == lettre; i++);
j++;
}
else
{
tab[j] = chaine[i];
i++; j++;
}
}
tab[j] = '\0';
return tab;
} |
Mais je dois appeler cette fonction de cette façon:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| char *maChaine[] = {"bonjof gbbffgw fdgfwggf wdfggdfgggggdffggff wdxur al",
"bbonne annee a tous",
"superbbe biien mon ammi"};
int i, j;
for(i = 0; i < 3; i++)
maChaine[i] = SupprimerDoublon(maChaine[i], 'n');
for(j = 0; j < 3; j++)
{
printf("%s\n", maChaine[j]);
free(maChaine[j]);
} |
et j'ai donc décidé de la modifier en (void) pour pouvoir l'appeler simplement comme ça:
Code:
1 2 3
|
for(i = 0; i < 3; i++)
SupprimerDoublon(maChaine[i], 'n'); |
Et c'est là que les problème commencent, voici mon code qui donne une segmentation fault à la ligne
Code:
strcpy(chaine, tab);
.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| void SupprimerDoublon(char *chaine, char lettre)
{
char *tab = malloc(sizeof(char) * strlen(chaine));
if(!tab) exit(-1);
int i = 0, j = 0;
while(chaine[i] != '\0')
{
if(chaine[i] == lettre)
{
tab[j] = chaine[i];
for(;chaine[i] == lettre; i++);
j++;
}
else
{
tab[j] = chaine[i];
i++; j++;
}
}
tab[j] = '\0';
strcpy(chaine, tab);
} |
Donc je me pose des questions, et je ne comprend pas pourquoi ça ne marche pas, sachant que dans le main je l'appelle de cette façon:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| char *maChaine[] = {"bonjof gbbffgw fdgfwggf wdfggdfgggggdffggff wdxur al",
"bbonne annee a tous",
"superbbe biien mon ammi"};
int i, j;
for(i = 0; i < 3; i++)
SupprimerDoublon(maChaine[i], 'n');
for(j = 0; j < 3; j++)
{
printf("%s\n", maChaine[j]);
} |
J'ai un petit doute sur le fait que j'alloue dynamiquement le tab mais pas la chaine qui arrive dans la fonction mais mes tests ne sont pas concluant. Pouvez-vous m'éclairer ?
Merci à vous.