Bonsoir tout le monde !
Je devais écrire pour hier une fonction qui sépare les mots d'une chaîne passé en paramètres et les stocks dans un tableau (str_to_wordtab) et une autre fonction qui affiche le résultat en séparant chaque mots
A savoir : tout les caractères non-alphanumériques sont considérés comme des séparateurs de motsHier soir à 22h30, je teste mon programme avec un main de cette sorte :
int main(int argc, char **argv)
{
my_show_to_wordtab(my_str_to_wordtab(argv[1]));
return (0);
}
Et je constate que le programme compilé fonctionne à merveille, et décide de rentrer chez moi !
Cela dit, 23h42, je me prend un zéro aux deux exercices... je fais une petite batterie de test, et me rend compte que mon programme renvoi une segfault pour toutes les chaînes dont le dernier caractère n'est pas alpha-numérique.
Et c'est très rageant. Car j'ai très bien réussi les programmes à finir pour ce soir (qui sont finalement à finir pour lundi soir), mais ils seront comptés comme faux parce que je n'arrive pas à dénicher le bug qui provoque cette segfault...
J'utilise des fonctions tels que my_strlen, car on ne doit utiliser que des fonctions que nous avons codé nous-même, sauf pour write(), malloc() et sizeof().
Le code se divise en six fonctions. Voici d'abord une table des matières, je poste le code juste en bas :
1 - wordtab_iznogoodVérifie si le caractère envoyé en paramètre est alphanumérique ou non.
Si oui, elle renvoi 1. Sinon 0.
2 - count_wordsCompte le nombre de mots dans la chaîne envoyée en paramètre. Pour trouver ou les mots se séparent, elle utilise la fonction wordtqb_iznogood.
En utilisant la variable flag elle supporte ainsi le cas ou deux mots sont séparés par plusieurs espaces ou caractères non-alphanumériques.
Elle renvoi le nombre de mots trouvés.
3. count_charCompte le nombre de caractères dans un mot.
Au premier caractère séparateur trouvé, elle renvoi le nombre de lettres comptées.
4. my_str_do_wordtabElle s'occupe des malloc pour les tableaux contenant les caractères.
Elle inscrit à chaque emplacement la lettre qui lui correspond.
Une fois arrivé à la fin, elle alloue un espace dans le dernier tableau de tableau et écrit simplement 0 pour signifier la fin du tableau.
Elle renvoi le tableau obtenu.
5. my_str_to_wordtabElle s'occupe du malloc pour le tableau contenant les tableaux de char.
Elle lance la fonction my_str_do_wordtab une fois la première allocation de mémoire réalisée. Quand le tableau a été rempli avec succès, elle le renvoi.
6. my_show_to_wordtabAffiche chaque mot contenu dans un tableau sous la forme de celui crée par la fonction my_show_to_wordtab.
Elle utilise les fonctions my_putstr et my_putchar pour afficher le résutlat. my_putchar affiche un caractère, my_putstr une chaine de caractère.
Voici le code des fonctions respectives :
A inclure : stdlib.h , les fonctions my_strlen(), my_putchar() et my_putstr(), les deux premières existent sous la forme strlen et putchar, la troisième je ne sais pas, mais elle est de toute façon très facile à écrire soit-mêmeint wordtab_iznogood(char c)
{
if (c < '0' || c > '9')
{
if (c < 'A' || c > 'Z')
{
if (c < 'a' || c > 'z')
return (1);
}
}
return (0);
}
int count_words(char *str)
{
int result;
int flag;
int cursor;
cursor = 0;
result = 0;
flag = 1;
while (str[cursor] != '\0')
{
if (wordtab_iznogood(str[cursor]) == 1)
flag = 1;
else
{
if (flag == 1)
result = result + 1;
flag = 0;
}
cursor = cursor + 1;
}
return (result);
}
int count_chars(char *str)
{
int x;
x = 0;
while (str[ x ] != '\0')
{
if (wordtab_iznogood(str[ x ]) == 1)
return (x);
x = x + 1;
}
return (x);
}
char **my_str_do_wordtab(char *str, char **result, int z, int x)
{
int y;
y = 0;
while (str[ x ] != '\0')
{
if (z < 1)
result[y] = malloc(sizeof(char) * (count_chars(&str[ x ])));
if (wordtab_iznogood(str[ x ]) == 1)
{
if (z < 1)
y = y - 1;
else
result[y][z] = 0;
y = y + 1;
z = -1;
}
else
result[y][z] = str[ x ];
x = x + 1;
z = z + 1;
}
result[y + 1] = malloc(sizeof(char));
result[y + 1][0] = 0;
return (result);
}
char **my_str_to_wordtab(char *str)
{
char **result;
result = malloc(sizeof(char*) * count_words(str) + 1);
result = my_str_do_wordtab(str, result, 0, 0);
return (result);
}
int my_show_to_wordtab(char **tab)
{
int cursor;
int nbr_elem;
cursor = 0;
nbr_elem = 0;
while (tab[cursor][0] != 0)
{
nbr_elem = nbr_elem + 1;
cursor = cursor + 1;
}
cursor = 0;
while (cursor < nbr_elem)
{
my_putstr(tab[cursor]);
my_putchar('\n');
cursor = cursor + 1;
}
return (0);
}