Bonjour,

Afin de m'entraîner, j'ai choisi de coder les fonctions de manipulation de chaînes de caractères dont je vais avoir besoin moi-même.

Voilà où j'en suis pour le moment :

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int taille = 0; /* Variable stockant temporairement la taille d'une chaîne de caractères donnée */
char *COPIE = NULL; /* pointeur de type char vers une chaîne de caractères (utiliser lors des copies de chaînes) */
char *CONCATENE = NULL; /* pointeur de type char vers une chaîne de caractères (utiliser lors de de la concaténation de chaînes) */
 
char str1[] = "Bonjour !";
char str2[] = "Bonjour ! ";
char str3[] = "Mon ami, ";
char str4[] = "comment vas-tu  ";
char str5[] = "Ma foi je vais bien,";
char str6[] = "et toi ???";
char str7[] = "i jev";
 
int COMPARE_CH(char str1[], char str2[]);
int COMPTER_CH(char str[]);
int RECHERCHER_CH(char str1[], char str2[]);
char *COPIER_CH(char str[]);
char *CONCATENER_CH(char str1[], char str2[]);
 
/* Fonction : CONCATENER_CH
 * But : Concatène deux chaînes de caractères.
 * Argument : str1[] -> chaîne de caractères 1.
              str2[] -> chaîne de caractères 2.
 * Return : Renvoie un pointeur vers le premier élément de la nouvelle chaîne obtenue.
 *-------------------------------------------------------------------------------------*/
 
char *CONCATENER_CH(char str1[], char str2[])
{
    int i = 0;
    int j = 0;
    int a;
    int taille_str1 = 0;
    int taille_str2 = 0;
 
    COMPTER_CH(str1);
    taille_str1 = taille;
    COMPTER_CH(str2);
    taille_str2 = taille;
    /* printf("taille str1 = %d\ntaille str2 = %d\n", taille_str1, taille_str2); */
 
    if ((CONCATENE = (char *)malloc((taille_str1+taille_str2)+2-1)) == NULL)
    {
        printf("Erreur d'allocation mémoire !");
        exit(EXIT_FAILURE);
    }
 
    for (a = 0; a < taille_str1; a++)
    {
        CONCATENE[a] = str1[i];
        i++;
    }
 
    for (a = 0; a < taille_str2; a++)
    {
        CONCATENE[(taille_str1)+a] = str2[j];
        j++;
    }
 
    CONCATENE[(taille_str1+taille_str2)] = '\0';
    return(CONCATENE);
 
    /* Vérification
    for (a = 0; a <= (taille_str1+taille_str2); a++)
    {
        printf("CONCATENE[%d] = %d\n", a, CONCATENE[a]);
    }
    return(CONCATENE);
    Fin vérification */
}
 
/* Fonction : RECHERCHER_CH
 * But : Rechercher une sous-chaîne de caractères dans une autre chaîne de caractères plus grande.
 * Argument : str1[] -> chaîne de caractères dans laquelle s'effectuera la recherche.
              str2[] -> chaîne de caractères à rechercher.
 * Return : Renvoie 1 si la recherche aboutie, 0 le cas échéant.
 *-------------------------------------------------------------------------------------*/
 
int RECHERCHER_CH(char str1[], char str2[])
{
    int a;
    int i = 0;
    int j = 0;
    int taille_str1 = 0;
    int taille_str2 = 0;
 
    COMPTER_CH(str1);
    taille_str1 = taille;
    COMPTER_CH(str2);
    taille_str2 = taille;
 
    /* Vérification visuelle, à virer
    printf("Taille str1 = %d\nTaille str2 = %d\n", taille_str1, taille_str2);
    printf("%s\nstr2[0] = %c\nstr2[1] = %c\nstr2[2] = %c\nstr2[3] = %c\nstr2[4] = %c\n", str2, str2[0], str2[1], str2[2], str2[3], str2[4]);
    fin vérification visuelle */
 
    for (a = 0; a < taille_str1; a++)
    {
        if (str1[i] == str2[0])
        {
            do
            {
                /* printf("J = %d\n", j); */
                /* Vérification visuelle */
                /* printf("STR1 : %c => STR2 : %c\n", str1[i], str2[j]); */
                /* Fin vérification visuelle */
            }
            while (str1[i++] == str2[j++] && j < taille_str2);
 
            if (str1[i-1] == str2[j-1])
            {
                if (j == taille_str2)
                {
                    return(1);
                }
            }
        }
        else
        {
            i++;
            j = 0;
        }
    }
    return(0);
}
 
/* Fonction : COPIER_CH
 * But : Copier une chaîne de caractères dans une autre chaîne.
 * Argument : str[] -> chaîne de caractères à recopier.
 * Return : COPIE -> pointeur sur le premier élément de la chaîne copiée.
 *-------------------------------------------------------------------------------------*/
 
char *COPIER_CH(char str[])
{
    /* free(COPIE);  facultatif */
    /* printf("COPIE : %s\n", COPIE); */
    int i = 0;
    int j = 0;
    int a = 0;
 
    COMPTER_CH(str);
    /* printf("Taille = %d\n", taille); */
 
    if ((COPIE = (char *)malloc(taille+1)) != NULL)
    {
        while (a < taille)
        {
            COPIE[j] = str[i];
            a++;
            i++;
            j++;
        }
        COPIE[j] = '\0';
    }
    else
    {
        printf("Erreur d'allocation de mémoire !");
        exit(EXIT_FAILURE);
    }
    /* system("pause"); */
    /* vérification
    for (a = 0; a <= taille; a++)
    {
        printf("COPIE[%d] = %d\n", a, COPIE[a]);
    }
        for (a = 0; a <= taille; a++)
    {
        printf("COPIE[%d] = %c\n", a, COPIE[a]);
    }
    printf("\n");
    fin vérification */
    return(COPIE);
}
 
/* Fonction : COMPTER_CH
 * But : Mesure la taille d'une chaîne de caractères, caractère '\0' <null> compris. Attention : on compte à partir de 0 !!!
         Exemple : si la fonction renvoie taille = 6, cela singifie qu'il a 7 caractères dans la chaîne : 0-1-2-3-4-5-6.
 * Argument : str[] -> chaîne de caractères à mesurer.
 * Return : taille -> un entier représentant la taille de la chaîne.
 *-------------------------------------------------------------------------------------*/
 
int COMPTER_CH(char str[])
{
    int i = 0;
    taille = 0;
 
    while (str[i] != '\0') /* Tant que l'on ne rencontre pas le caractère null... */
    {
        taille++; /* on incrémente la taille et le compteur i de 1 */
        i++;
    }
    return(taille); /* et on renvoie la taille de la chaîne */
}
 
/* Fonction : COMPARE_CH
 * But : Comparer deux chaînes de caractères.
 * Argument : str1[] -> chaîne de caractères une.
 *            str2[] -> chaîne de caractères deux.
 * Return : Renvoie 1 si les deux chaînes sont identiques, 0 le cas échéant.
 *-------------------------------------------------------------------------------------*/
 
int COMPARE_CH(char str1[], char str2[])
{
    int i = 0;
    int j = 0;
 
    do /* On boucle tant que str1[i] OU str2[j] n'est pas équivalent au caractère null */
    {
        /* vérification
        printf("str1[%d] = %d ? str2[%d] = %d\n", i, str1[i], j, str2[j]);
        fin vérification */
 
        if (str1[i] != str2[j]) /* si str1[i] est différent de str2[j], alors les deux chaînes ne sont pas identiques */
        {
            return(0); /* on quitte la fonction en renvoyant 0 */
        }
        i++; /* tant qu'on ne rencontre pas le caractère de fin de châine, on incrémente les compteurs */
        j++;
    }  while (str1[i] != '\0' || str2[j] != '\0');
 
    return(1);
}
 
int main ()
{
    COMPTER_CH(str1);
    printf("Taille de %s = %d\n", str1, taille);
    COMPTER_CH(str2);
    printf("Taille de %s = %d\n", str2, taille);
 
    if ((COMPARE_CH(str1, str2)) == 1)
    {
        printf("Les deux chaînes sont identiques !\n");
    }
    else
    {
        printf("Les deux chaînes sont différentes !\n");
    }
 
    COPIER_CH(str1);
    printf("Chaîne copiée = %s\n", COPIE);
    COPIER_CH(str2);
    printf("Chaîne copiée = %s\n", COPIE);
    COPIER_CH(str3);
    printf("Chaîne copiée = %s\n", COPIE);
    COPIER_CH(str4);
    printf("Chaîne copiée = %s\n", COPIE);
    COPIER_CH(str5);
    printf("Chaîne copiée = %s\n", COPIE);
    COPIER_CH(str6);
    printf("Chaîne copiée = %s\n", COPIE);
 
    if ((RECHERCHER_CH(str5, str7)) == 1)
    {
        printf("Chaîne %s trouvée !\n", str7);
    }
    else
    {
        printf("Chaîne %s non trouvée !\n", str7);
    }
    CONCATENER_CH(str3, str4);
    printf("Chaîne concaténée : %s\n", CONCATENE);
}
Dans un souci pédagogique, que pensez-vous du code ? Est-ce bien codé ? En voyant ce code, auriez-vous des conseils à me donner pour plus de rigueur et de "propreté" ?

Par ailleurs, j'ai testé un maximum mes différentes fonctions, je n'ai pour le moment pas réussi à faire planter le programme ou bien à obtenir un résultat erroné... mais bon va falloir que je continue à tester je pense.

Merci par avance