Il y a plein de fuites de mémoire potentielles dans ton code. De plus, ta fonction de saisie est plutôt bancale, elle manque de logique. Si la chaine dépasse, elle appelle une autre fonction pour concaténer (et une fois maximum).
Cela fait un peu "usine à gaz" manquant de cohérence.
Je te propose une solution un peu plus clean :
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
| #define TAILLE_MAX_SAISIE 10 /* valeur arbitraire, à modifier si besoin */
char * saisie(void)
{
char tab[TAILLE_MAX_SAISIE];
char * chaine = NULL;
size_t taille_totale = 1; /* la chaine contient au moins '\0' */
int fin_boucle = 0;
do
{
size_t taille_saisie;
fgets(tab , TAILLE_MAX_SAISIE , stdin);
{
char * supp_lf;
supp_lf = strchr(tab , '\n'); /* on vire le '\n' s'il est présent */
if (supp_lf != NULL)
{
*supp_lf = '\0';
fin_boucle = 1;
}
}
taille_saisie = strlen(tab);
taille_totale += taille_saisie;
if (taille_totale == 1 /* on cree une chaine vide meme si on n'a rien saisi pour éviter un crash */ || taille_saisie != 0)
{
char * tmp_realloc;
tmp_realloc = realloc(chaine , taille_totale);
if (tmp_realloc != NULL)
{
if (chaine == NULL)
*tmp_realloc = '\0'; /* lors de la 1ere alloc, on met '\0' comme 1er caractère (à cause du strcat plus bas) */
chaine = tmp_realloc;
}
else
{
free(chaine);
chaine = NULL;
break;
}
strcat(chaine , tab);
}
} while (fin_boucle == 0);
return chaine;
} |
Quelques remarques :
result = malloc(sizeof(*texte));
ouch ! Tu confonds apparemment sizeof et strlen. En tout cas, le résultat de sizeof ici est... 1 !
De plus, n'oublie pas le '\0' final de ta chaine, il doit être compté.
Ton tableau valeurAscii ne sert à rien du tout. Tu peux mettre le résultat de ton calcul directement dans ta chaine.
Il n'y a de free nulle part !
Partager