Problème avec taille chaine de caractères variable

Résolu
graphtyrael Messages postés 12 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 juillet 2006 - 2 févr. 2005 à 11:37
graphtyrael Messages postés 12 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 juillet 2006 - 2 févr. 2005 à 12:34
Bonjour à tous !

Je cherche à créer une chaine de caractère de taille variable qui s'agrandit au fur et à mesure que je rentre des caractères. J'ai donc fait un code ressemblant à ça :

char *frappe;
char *texte;
char *buffer;


texte = (char *) malloc (sizeof(char));
frappe = (char *) malloc(sizeof(char));

*frappe = 0;


while(*frappe != 27) //Tant que l'on ne presse pas echap
{

*frappe = getch(); /*je capture le caractere saisi et le stock dans *frappe*/


buffer = (char *) malloc (strlen(texte)*sizeof(char)); /*j'alloue à buffer la même taille que pour "texte"*/


strcpy(buffer,texte); //je copie texte dans buffer


free(texte); //je libère texte


texte = (char *) malloc (strlen(buffer)+1*sizeof(char));
/*j'alloue la taille de buffer (l'ancienne taille de texte) + 1 pour stocker le nouveau caractère*/


strcpy(texte,buffer); /*je copie l'ancien texte du buffer dans texte*/


strcat(texte,frappe); //j'ajoute le nouveau caractère.

free(buffer); //je libère buffer.
}

Et après bonne compilation, il se produit toutes sortes de bizarerries : la taille de buffer s'initialise à 3 alors qu'il n'y a rien dedans, l'affichage de la chaine produit des caractères bizarres toujour au même endroit, et au bout d'un certain nombre de frappes (toujours le meme ici aussi) le programme quitte sans prévenir et sans afficher d'erreur non plus.

Je ne sais plus trop quoi faire... j'ai essayé différentes méthodes d'allocation de mémoire mais toujours les mêmes problèmes.

Pour précision, c'est un bout de code qui servira (peut etre) au développement d'un pseudo-traitement de texte en mode console sous windows (donc pas possible de définir une taille maximale par défaut). Je développe sous DEV-C++.

Je ne pense pas être le seul à qui ce problème est arrivé.. Si quelqu'un pouvait m'aider je lui en serait très reconnaissant!

@pluch

- Graph Tyrael -

5 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 févr. 2005 à 12:32
c'est le but de realloc, s'il y a de la place à la fin de la première allocation seule la structure interne de l'allocation est modifiée, sinon elle prend un autre endroit de la mémoire pour y recopier la chaîne.
3
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 févr. 2005 à 12:25
Plusiereures chose :
- en C les chaînes de carctères sont terminées par un carctères nul de fin, il ne faut donc pas oublier de l'allouer (pas compris dans le strlen)
- pour réallouer une chaîne, il y a la fonction realloc.
- tu ne termine pas des châines de caractères.
voici une version simplifiée de ce que tu veut faire :

// alocation initiale
int length = 0;
char* text = malloc(lenght+1);
text[0] = '\0';
while(1)
{
// récupération caractère
char c = getch();
if(c == 27)
break;

// on stocke le caractère (à la place du nul de l'ancienne string)
text[length] = c;

// augmentation de la taille, ajout nul final
length++;
text = realloc(text, length+1);
text[length] = '\0';
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 févr. 2005 à 12:26
J'ai oublié le free(text) à la fin.
0
graphtyrael Messages postés 12 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 juillet 2006
2 févr. 2005 à 12:31
J'ai compris !

Parcontre... la fonction realloc() ne réinitialise t elle pas texte? Est ce que le contenu de texte sera conservé lor de la réallocation?

Merci pour ta réponse !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
graphtyrael Messages postés 12 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 juillet 2006
2 févr. 2005 à 12:34
Merci beaucoup à toi !!!
0
Rejoignez-nous