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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.