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
|
# include <stdio.h>
# include <stdlib.h>
/* 0=normal 1=debug */
#define DBG 0
/* Fonction qui compte le nombre de
caractère de la chaine passé en argument*/
int compte_caract (char const *chaine)
{
int i = 0;
while (chaine[i] != '\0')
i++;
return i;
}
/* Fonction qui compte le nombre de
mot de la chaine passé en argument*/
int compte_mot (char const *chaine)
{
int i, j, mot = 0;
i = compte_caract (chaine);
for (j = 0; j <= i; j++)
{
if (chaine[j] == ' ')
{
mot++;
}
}
return mot + 1;
}
/* Fonction qui decompose une chainede caractère en un tableau
de caractère.*/
char **decompose_mot (char const *chaine)
{
int i = compte_mot (chaine);
#if DBG
printf ("i=%d '%s'\n", i, chaine);
#endif
/* -ed- ajoute 1 pour terminer la liste des pointeurs par NULL. */
char **tab = malloc ((i + 1) * sizeof (char *));
if (tab != NULL)
{
/* -ed- j n'est pas utilisee */
int /*j, */ a, b, k = 0;
for (a = 0; a < i; a++)
{
/* -ed- il faut ranger les caracteres quelque part...
j'ai mis une taille qui est garantie etre correcte, mais
qui n'est pas optimisee.
*/
tab[a] = malloc (compte_caract (chaine) + 1);
/* recopie du mot */
b = 0;
while (chaine[k] != ' ' && chaine[k] != 0)
{
tab[a][b] = chaine[k];
b++;
k++;
}
tab[a][b] = '\0';
#if DBG
printf ("tab[%d]='%s'\n", a, tab[a]);
#endif
/* sauter le separateur */
k++;
}
tab[a] = NULL;
#if DBG
printf ("tab[%d]='%s'\n", a, tab[a]);
#endif
}
return tab;
}
/* Fonction qui comapare deux chaines et renvoie la difference en
ascii des deux premiers caratères différents sinon renvoie 0.*/
int compare_chaine (char const *ch1, char const *ch2)
{
int i, t1, t2, /* k, */ c; /* -ed- k n'est pas utilisee */
t1 = compte_caract (ch1);
t2 = compte_caract (ch2);
if (t1 < t2)
c = t1;
else
c = t2;
printf ("c= %d\n", c);
for (i = 0; i < c; i++)
{
if (ch1[i] != ch2[i])
return ch1[i] - ch2[i];
}
return 0;
}
// Fonction principale
/* -ed- ajoute void, car il n'y a pas de parametres */
int main (void)
{
/* -ed- ajoute const, car une chaine litteralle n'est pas modifiable */
char const *car = "AdBmamX toto tata mimi";
char const *c = "AdBmamX";
/* -ed-
printf ("%s", decompose_mot (car));
Ceci n'a aucun sens, vu que decompose_mot() retourne
l'adresse d'un tableau de pointeurs sur char.
*/
/* on recupere l'adresse du tableau de pointeurs */
{
char **pp = decompose_mot (car);
if (pp != NULL)
{
/* lecture des chaines */
{
int i = 0; /* 1ere chaine */
/* on lit chaque pointeur tant qu'il nne vaut pas NULL */
while (pp[i] != NULL)
{
printf ("'%s'\n", pp[i]);
i++;
}
}
/* liberation */
{
int i = 0;
while (pp[i] != NULL)
{
/* -ed- liberation du bloc */
free (pp[i]), pp[i] = NULL;
i++;
}
}
free (pp), pp = NULL;
}
}
printf ("La difference entre ch1 et ch2 est: %d\n",
compare_chaine (car, c));
/* -ed- main() retourne un int.
0 est une valeur standard qui sigifie OK pour le systeme */
return 0;
} |
Partager