Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1912 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C]Taille de chaine de caractères dynamique...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C]Taille de chaine de caractères dynamique...

n°386872
Profil sup​primé
Posté le 08-05-2003 à 10:58:04  answer
 

Salut à tous !
 
Je voudrai dans programme, que l'utilisateur puisse saisir une chaine de caractère aussi longue quil le veu sans avoir à définir sa taille. Les strings n'étant pas géré en C comment faire?
 
Je pense à un truc avec malloc &co mais je sais pas trop comment faire pour allouer juste ce quil fo (pour pas que le prog pompe trop de ressource...)
 
 
Merci à tous++

mood
Publicité
Posté le 08-05-2003 à 10:58:04  profilanswer
 

n°386873
Taz
bisounours-codeur
Posté le 08-05-2003 à 10:59:22  profilanswer
 

ben fo faire un boule avec du realloc

n°386877
Profil sup​primé
Posté le 08-05-2003 à 11:04:52  answer
 

euhhhhhhh tu pourrai pas etre plus précis ?

n°386880
Taz
bisounours-codeur
Posté le 08-05-2003 à 11:09:46  profilanswer
 
n°386941
Profil sup​primé
Posté le 08-05-2003 à 12:04:25  answer
 

Ok mais comment faire pour juste rentré une chaine de caractere sans spécifier la taille et que le prog allou tout seul soi 4 char soi 4000000 char (selon taille de la chaine entrée).
 
Ca serai sympa de m'expliquer un peu ou si il ya avai un tuto !
 
merci

n°387001
Taz
bisounours-codeur
Posté le 08-05-2003 à 13:33:59  profilanswer
 

ben en fait fgets stocke  à l'adrese donnée une chaine, '\n' final compris, sauf si la chaine etait plus longue, auquel cas il ne le fait pas. donc en pseudo C et sans vrai traitement d'erreur
 

Code :
  1. // alocation de depart
  2. char *str=malloc(N);
  3. size_t capacité=N;
  4. // pointeur pour la saisie
  5. char *ptr=str;
  6. // tant qu'il y a des donnes et que le dernier caractere n'est ps un '\n'
  7. while(fgets(ptr, capacite, stdin) != NULL
  8.       && ptr[strlen(ptr)-1]!='\n')
  9. {
  10.   // pas assez de place
  11.   // on agrandit la zone memoire
  12.   str=realloc(str, 2*capacité);
  13.   // on met le pointeur de saisie au bone endroit
  14.   ptr=str+capacite;
  15.   capacite*=2;
  16. }


 
enfin j'ecris ça a chaud le ventre vide, à toi de veriifer l'algo

n°387003
Profil sup​primé
Posté le 08-05-2003 à 13:38:28  answer
 

ok merci bien je vais tester tout ca

n°387449
Profil sup​primé
Posté le 08-05-2003 à 20:22:57  answer
 

ya une couille voila mon code
 

Code :
  1. #define N 2
  2. ....
  3. char * chaine=malloc(N);
  4. size_t capacite=N;
  5.    char lettre;
  6.  // pointeur pour la saisie
  7. char *ptrchaine=chaine;
  8.  // tant qu'il y a des donnes et que le dernier caractere n'est ps un '\n'
  9. printf("Entrez la chaine :\n" );
  10. while(fgets(ptrchaine,capacite, stdin) != NULL && ptrchaine[strlen(ptrchaine)-1]!='\n')
  11.  {
  12.    // pas assez de place
  13.    // on agrandit la zone memoire
  14.    chaine=realloc(chaine, capacite*2);
  15.    // on met le pointeur de saisie au bone endroit
  16.    ptrchaine=chaine;
  17.    capacite*=2;
  18.   
  19.  }
  20.  printf("chaine :\n%s",chaine);


 
Le pb C que si je rentre une chaine genre "le petit chat est mort", le resultat dans la variable est "at est mort".
 
Ou est passé le reste ??
 
J'avou que G un peu de mal avec tout ce qui est pointeur et mémoire...
 
Merci de ton aide


Message édité par Profil supprimé le 08-05-2003 à 20:24:15
n°387557
Angel_Doog​las
Le dernier des humains
Posté le 08-05-2003 à 21:52:30  profilanswer
 

Jardy a écrit :

ya une couille voila mon code
 

Code :
  1. #define N 2
  2. ....
  3. char * chaine=malloc(N);
  4. size_t capacite=N;
  5.    char lettre;
  6.  // pointeur pour la saisie
  7. char *ptrchaine=chaine;
  8.  // tant qu'il y a des donnes et que le dernier caractere n'est ps un '\n'
  9. printf("Entrez la chaine :\n" );
  10. while(fgets(ptrchaine,capacite, stdin) != NULL && ptrchaine[strlen(ptrchaine)-1]!='\n')
  11.  {
  12.    // pas assez de place
  13.    // on agrandit la zone memoire
  14.    chaine=realloc(chaine, capacite*2);
  15.    // on met le pointeur de saisie au bone endroit
  16.   
  17.                   ptrchaine=chaine; //+qq chose, sinon tu ecris de nouveau au debut de la chaine
  18.   
  19.                   capacite*=2;
  20.   
  21.  }
  22.  printf("chaine :\n%s",chaine);


 
Le pb C que si je rentre une chaine genre "le petit chat est mort", le resultat dans la variable est "at est mort".
 
Ou est passé le reste ??
 
J'avou que G un peu de mal avec tout ce qui est pointeur et mémoire...
 
Merci de ton aide


 
Parce que tu reecris sur la meme zone  
 
De plus le doublement de la capacite a chaque iteration, je ne suis pas sur que ce soit une bonne idee (mais bon ce n'est pas ca le probleme).


Message édité par Angel_Dooglas le 08-05-2003 à 21:53:47
n°387570
Taz
bisounours-codeur
Posté le 08-05-2003 à 22:00:10  profilanswer
 

remplace ton define par  
 
const int N=2;

mood
Publicité
Posté le 08-05-2003 à 22:00:10  profilanswer
 

n°388044
Profil sup​primé
Posté le 09-05-2003 à 11:37:00  answer
 

Argggggggggg j'en peu plus !! J'arrive pas à recupérer ma chaine correctment !!!! ca me tronque des bouts !!!!
 
J'en ai marre !!!
 
Je met le code qui compile si kkun a le temps de m'aider !!!
 
Je suis sur que C pas grand chose mais la je seche !!
 
MERCI
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <malloc.h>
  5. void supprime_lettre(char *,int,char);
  6. void main(void)
  7. {
  8. // alocation de depart
  9.  
  10. const int N=5;
  11. char * chaine=malloc(N);
  12. size_t capacite=N;
  13.    char lettre;
  14. int i;
  15.  // pointeur pour la saisie
  16. char * ptrchaine=chaine;
  17.  // tant qu'il y a des donnes et que le dernier caractere n'est ps un '\n'
  18. printf("Entrez la chaine :\n" );
  19. while(fgets(ptrchaine,capacite, stdin) != NULL && ptrchaine[strlen(ptrchaine)-1]!='\n')
  20.  {
  21.    // pas assez de place
  22.    // on agrandit la zone memoire
  23.    chaine=realloc(chaine, capacite+N);
  24.    // on met le pointeur de saisie au bone endroit
  25.    ptrchaine=chaine+N;
  26.    capacite+=N;
  27.   
  28.  }
  29.  ptrchaine=chaine;
  30. for(i=0 ; i<12 ;i++)printf("chaine :\n%s\n",ptrchaine+i);
  31. /*printf("Entrez la longueur de la chaine : " );
  32. scanf("%d",&size);
  33. fflush( stdin );
  34. chaine=(char*) malloc(size* sizeof(char));
  35. printf("Entrez la chaine :\n" );
  36. gets(chaine);
  37. */
  38. printf("Entrez le caractere a supprimer : %c" );
  39. scanf("%c",&lettre);
  40. supprime_lettre(ptrchaine,capacite,lettre);
  41. printf("\nChaine sans la lettre %c : %s\n\n",lettre,chaine);
  42. free(chaine);
  43. system("pause" );
  44. }
  45. void supprime_lettre(char *string ,int taille,char lettre)
  46. {
  47. int i,j;
  48. for(i=0 ; i<taille ; i++)
  49.  if(string[i]==lettre)
  50.   for(j=i ; j<taille-1 ; j++)
  51.   {
  52.    string[j]=string[j+1];
  53.    i--;
  54.   }
  55. }

n°388059
Angel_Doog​las
Le dernier des humains
Posté le 09-05-2003 à 11:53:44  profilanswer
 

Jardy a écrit :


 
MERCI
 

Code :
  1. int i,j;
  2. for(i=0 ; i<taille ; i++)
  3. if(string[i]==lettre)
  4.   for(j=i ; j<taille-1 ; j++)
  5.   {
  6.    string[j]=string[j+1];
  7.    i--;
  8.   }
  9. }




 
Qu'est ce que c'est que cette horreur?


Message édité par Angel_Dooglas le 09-05-2003 à 11:54:17
n°388068
Profil sup​primé
Posté le 09-05-2003 à 12:01:21  answer
 

un algo bourin qui marche.... Je voi pas en quoi il est horrible..

n°388085
Angel_Doog​las
Le dernier des humains
Posté le 09-05-2003 à 12:12:16  profilanswer
 

Ah? Tu es sur que le i-- est a sa place?
 
De plus c'est vraiment pas une bonne idee de changer la variable d'indentation de la boucle a l'interieur de la boucle meme.


Message édité par Angel_Dooglas le 09-05-2003 à 12:14:19
n°388103
Profil sup​primé
Posté le 09-05-2003 à 12:23:09  answer
 

tinquite pas ya maitrise
le i-- ser jsute a revenir un arriere. ca ca marche C pas mon pb par contre si tu peu resoudre mon pb de pointeur je t'en serai fortmement reconnaissant
merci

n°388105
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 09-05-2003 à 12:27:47  profilanswer
 

Angel_Dooglas a écrit :

Ah? Tu es sur que le i-- est a sa place?
 
De plus c'est vraiment pas une bonne idee de changer la variable d'indentation de la boucle a l'interieur de la boucle meme.


 
C'est clair. En plus, ces 2 boucles peuvent être compactées en une seule  :jap:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°388108
Profil sup​primé
Posté le 09-05-2003 à 12:31:47  answer
 

l'heure n'est pas à l'optimisation mais au bon fonctionnement de ce code...

n°388110
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 09-05-2003 à 12:33:43  profilanswer
 

Jardy a écrit :

l'heure n'est pas à l'optimisation mais au bon fonctionnement de ce code...


 
C'est pas une question d'optimisation, c'est une question de propreté


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°388111
Profil sup​primé
Posté le 09-05-2003 à 12:36:12  answer
 

libre a toi de penser que ta version serai plus propre.
 
Moi j'aime bien celle la je la comprend et elle me parai bien.
Respectons nous les uns les autres !! Je ne suis pas une grosse bete mais j'ai posté parce que G un pb d'algo pas un pb de "propreté". Merci

n°388117
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 09-05-2003 à 12:41:37  profilanswer
 

Jardy a écrit :

libre a toi de penser que ta version serai plus propre.
 
Moi j'aime bien celle la je la comprend et elle me parai bien.
Respectons nous les uns les autres !! Je ne suis pas une grosse bete mais j'ai posté parce que G un pb d'algo pas un pb de "propreté". Merci


 
Si tu es fermé aux conseils qu'on te donne, tant pis pour toi [:spamafote]
 
Ton algo est faux, remets toi un peu en question des fois...  :sarcastic:  
 
(exemple, si string[0]==lettre, tu as i qui va être négatif au tour suivant :sarcastic:  :sarcastic:  :sarcastic: )


Message édité par Tetragrammaton IHVH le 09-05-2003 à 12:52:23

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°388124
Profil sup​primé
Posté le 09-05-2003 à 12:46:26  answer
 

je suis pas fermé au conseil mais voi tu ce n'est pas le pb qui membete le plus en ce moment. Chaque choses en son temps. Tu as sen doute raison car plus expérimenté que moi. moi le code je voi aps trop comment l'ecrite mieux. C tt. ne prend pas mal ce que je di mais je suis un peu perdu dans le cyberspace avec mes pointeurs...
 
merci de tes conseils ! (dsl si G paru fermé ;))

n°388338
Konar
Posté le 09-05-2003 à 15:28:59  profilanswer
 

++Taz a écrit :

remplace ton define par  
 
const int N=2;


 
tiens je l'avais raté celle la...
et c'est quoi le but de cette manip a part d'avoir une variable en plus (une globale de preference tiens...) ?
 
ou alors les macros sont devenues interdites ?
 
la faut m'expliquer...
 
et en plus c'est mal const dans certains cas, genre avec un const_cast on pourrait ptet changer sa valeur (pareil avec un define mais plus difficile)

n°388361
Taz
bisounours-codeur
Posté le 09-05-2003 à 16:02:05  profilanswer
 

les macros ont été crées et utilisés ans ce cas pour pallier au faiblesses du langage. maintenant le langage integere la notion de pseudo-constante. tu as donc l'avantage de posséder une variable typée. ç aevite aussi les problèmes de multiples définitions des macro qui se bouffent les une les autres. le const n'est jamais jamais mal.
jusqu'ici on fait du C, donc tu gardes tes histoires de cast...
 

n°388376
Konar
Posté le 09-05-2003 à 16:16:04  profilanswer
 

++Taz a écrit :

les macros ont été crées et utilisés ans ce cas pour pallier au faiblesses du langage. maintenant le langage integere la notion de pseudo-constante. tu as donc l'avantage de posséder une variable typée. ç aevite aussi les problèmes de multiples définitions des macro qui se bouffent les une les autres. le const n'est jamais jamais mal.
jusqu'ici on fait du C, donc tu gardes tes histoires de cast...
 


 
du calme du calme...
 
chuis d'accord pour le const, faut en mettre plein.
 
mais sinon pour les #define c'est pas juste une histoire de typage. deja je me vois mal remplacer tous mes #define, qui me servent dans plein de fichiers, par des globales de partout, ca ferait chelou...
 
tiens pour te faire plaisir voila une macro comme on en voit des douzaines :

Code :
  1. #define BEGIN_MSG_MAP(theClass) \
  2. public: \
  3. BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
  4. { \
  5.  BOOL bHandled = TRUE; \
  6.  hWnd; \
  7.  uMsg; \
  8.  wParam; \
  9.  lParam; \
  10.  lResult; \
  11.  bHandled; \
  12.  switch(dwMsgMapID) \
  13.  { \
  14.  case 0:

n°388876
Dag elg
Posté le 10-05-2003 à 00:35:09  profilanswer
 

Bon je suis pas sur mais je dirais que:
a chaque reallocation il faut ajouter N a ptrchaine.
Donc pour k realloc ca fait plutot ptrchaine = chaine +k*N
en plus fgets colle un \0 automatique donc c'est meme plutot
ptrchaine = chaine + k*(N-1) pour ecraser le \0.

n°388947
Profil sup​primé
Posté le 10-05-2003 à 10:38:05  answer
 

ahhhhhhhh meci de t'interresser a mon probleme !
Je vais tester !

n°388951
sombresong​e
Posté le 10-05-2003 à 10:56:12  profilanswer
 

Tu pourais aussi gérer toi meme ta chaine avec une liste chainer sur les caractères

n°388975
Profil sup​primé
Posté le 10-05-2003 à 12:07:22  answer
 

Citation :


Ton algo est faux, remets toi un peu en question des fois...    
 
(exemple, si string[0]==lettre, tu as i qui va être négatif au tour suivant         )


 
correction:
 

Code :
  1. for(i=0 ; i<size ; i++)
  2.  if(chaine[i]=='e')
  3.   {
  4.   for(j=i ; j<size-1 ; j++)
  5.     {
  6.     chaine[j]=chaine[j+1];
  7.     }
  8.    i--;
  9.   }

n°388998
Profil sup​primé
Posté le 10-05-2003 à 13:01:38  answer
 

Bon j'ai essayé de modifier quelques trucs et ca marche tjs pas.
 
Si je rentre la chaine : "le petit chat est mort de froid dans la nuit noire", j'obtient "le petit  est roid  oire"....
 
AIDEZ MOI !!!!
 
voila le code  

Code :
  1. const int N=5;
  2.      char * chaine=malloc(N);
  3.      size_t capacite=N;
  4.      char lettre;
  5.      int i;
  6.      
  7.       // pointeur pour la saisie
  8.      char * ptrchaine=chaine;
  9.    
  10.       // tant qu'il y a des donnes et que le dernier caractere n'est ps un '\n'
  11.    
  12.      printf("Entrez la chaine :\n" );
  13.      
  14.      
  15.      while(fgets(ptrchaine,capacite, stdin) != NULL && ptrchaine[strlen(ptrchaine)-1]!='\n')
  16.       {
  17.           // pas assez de place
  18.           // on agrandit la zone memoire
  19.           chaine=realloc(chaine, capacite+N);
  20.           // on met le pointeur de saisie au bone endroit
  21.           ptrchaine=chaine+capacite-1;
  22.           capacite+=N;
  23.          
  24.       }

n°389120
Babouchka
You're no fun anymore
Posté le 10-05-2003 à 15:33:32  profilanswer
 

Code :
  1. int main(void)
  2. {
  3.     const int N = 5;
  4.     char *chaine=malloc(N);
  5.     int capacite=N;
  6.    
  7.     char *ptrchaine = chaine;
  8.     puts("Entrez la chaine :" );
  9.     while ( (*ptrchaine = getchar()) != '\n' )
  10.     {
  11.         ptrchaine++;
  12.             if ( ptrchaine == chaine + capacite )
  13.             {
  14.                 chaine = realloc(chaine, capacite + N);
  15.                 ptrchaine = chaine + capacite;
  16.                 capacite += N;
  17.             }
  18.     }
  19.    
  20.     *ptrchaine++ = '\0';
  21.      puts(chaine);
  22.      free(chaine);
  23.      return 0;
  24. }

 
 
ça devrait mieux marcher
 
edit:merde, je teste pas si y'a assez de place pour le  

Code :
  1. *ptrchaine++ = '\0';


enfin bref c'est à peu près ça quoi, faut fignoler un peu :whistle:
 
A+


Message édité par Babouchka le 10-05-2003 à 15:37:24
n°389199
Dag elg
Posté le 10-05-2003 à 16:44:18  profilanswer
 

Je pense que c'est k*(N-1) pour placer le pointeur or tu mets capacite-1 ce qui est k*n -1 au lieu de k*n - k.

n°389608
SiliconGho​st
Posté le 11-05-2003 à 12:19:32  profilanswer
 

Bon, voici ma version, testée sous gcc + solaris... Ca devrait aussi passer sous windows sans problèmes:

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #define INIT_BUFFER_LEN 3
  4. int main(char argc, char *argv[])
  5. {
  6.    char *buffer;
  7.    char c;
  8.    int bufferindex = 0;
  9.    size_t bufferlen = INIT_BUFFER_LEN;
  10.  
  11.    if((buffer = (char *)malloc(bufferlen)) == NULL)
  12.    {
  13.       fprintf(stderr, "Impossible d'allouer la taille specifiee.\n" );
  14.       return(-1);
  15.    }
  16.  
  17.    printf("Entrez votre chaine: " );
  18.    while((c = getchar()) != '\n')
  19.    {
  20.       *(buffer + bufferindex++) = c;
  21.       if(bufferindex == (int)(bufferlen))
  22.       {
  23.          bufferlen = (size_t)(bufferindex * 2);
  24.          realloc(buffer, bufferlen);
  25.          if(buffer == NULL)
  26.          {
  27.             fprintf(stderr, "Impossible de reallouer la taille specifiee.\n" );
  28.             return(-1);
  29.          }
  30.       }
  31.    }
  32.    *(buffer + bufferindex++) = '\0';
  33.  
  34.    printf("%s. index = %d, max_size =  %d.\n", buffer, bufferindex, bufferlen);
  35.    free(buffer);
  36.  
  37.    return(0);
  38. }


 
La politique de réallocation de mémoire en cas de dépassement n'est pas la plus fine (x2 à chaque coup), suivant ce que tu désire fais plutôt un +=10 ou un truc dans le genre. Tiens moi au courant si cela ne marche pas.


---------------
A programmer never dies. He just cast to void.
n°389611
Taz
bisounours-codeur
Posté le 11-05-2003 à 12:21:37  profilanswer
 

et quid de fgets?

n°389633
Profil sup​primé
Posté le 11-05-2003 à 12:56:18  answer
 

merci à tous ! je vais conpulser un peu tout cela ! Je vous tient au courant si ca ne marche pas !!

n°389634
Taz
bisounours-codeur
Posté le 11-05-2003 à 12:57:25  profilanswer
 

la solution de SiliconGhost est tres compliqué et réinvente la poudre... vive fgets :whistle:

n°389636
Profil sup​primé
Posté le 11-05-2003 à 13:09:06  answer
 

oui C kler que C un peu complex et ca marche pas sous vc++, memory access violation...
 
T'aurais pas la soltiion ++Taz sur la version que tu ma écrite (avec fgets) mais qui marche pas...
 
Le prog de silicon bloque sur le realloc au 3eme passsage dans la boucle...
 
merci

n°389650
Taz
bisounours-codeur
Posté le 11-05-2003 à 13:32:29  profilanswer
 

ça devrait pas trop merder
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. char* getline()
  5. {
  6.   char *line=NULL;
  7.   size_t capacity=4; /* par exemple */
  8.   size_t empty=capacity;
  9.   if((line=calloc(capacity, 1))== NULL)
  10.     {
  11.       /* erreur, faites ce que bon vous semble pour la traiter
  12.          solution user-friendly */
  13.       perror("calloc" );
  14.       exit(1);
  15.       /* on pourrait tout simplement retourn er NULL
  16.          et transmettre la patate chaude */
  17.     }
  18.   puts("******** entree boucle ******" );
  19.   while((fgets(line+strlen(line), empty, stdin)!= NULL)
  20.         && (line[strlen(line)-1]!='\n'))
  21.     {
  22.       printf("e%d c%d l%d \"%s\"\n", empty, capacity, strlen(line), line);
  23.       if((line=realloc(line, 2*capacity)) == NULL)
  24.         {
  25.           perror("realloc" );
  26.           exit(1);
  27.         }
  28.       empty=capacity;
  29.       capacity*=2;
  30.     }
  31.   return line;
  32. }

j'ai pas compiler mais devrait etre bon. par contre c pas optimisé, strlen eest calculé plusieurs fois

n°389665
SiliconGho​st
Posté le 11-05-2003 à 13:54:13  profilanswer
 

Ooops mea culpa, j'ai fais une gaffe dans l'appel à realloc voici la version corrigée (testée sur WinXP + V Studio .NET):

Code :
  1. #include <stdlib.h>
  2.   #include <stdio.h>
  3.  
  4.   #define INIT_BUFFER_LEN 3
  5.  
  6.   int main(char argc, char *argv[])
  7.   {
  8.        char *buffer;
  9.        char c;
  10.        int bufferindex = 0;
  11.        size_t bufferlen = INIT_BUFFER_LEN;
  12.        // Choppe un peu de memoire pour stocker ta chaine
  13.        if((buffer = (char *)malloc(bufferlen)) == NULL)
  14.        {
  15.             // Un pb?
  16.             fprintf(stderr, "Impossible d'allouer la taille specifiee.\n" );
  17.             return(-1);
  18.        }
  19.        
  20.        printf("Entrez votre chaine: " );
  21.        while((c = getchar()) != '\n')
  22.        {
  23.             // Copie le caractere dans la chaine
  24.             *(buffer + bufferindex++) = c;
  25.             // Si on est a la limite de la taille dispo
  26.             if(bufferindex == (int)(bufferlen))
  27.             {
  28.                  // On double la taille (peut mieux faire)
  29.                  bufferlen = (size_t)(bufferindex * 2);
  30.                  // On realloue le bloc
  31.                  buffer = (char *) realloc((void *)buffer, bufferlen);
  32.                  // Pb de reallocation ?
  33.                  if(buffer == NULL)
  34.                  {
  35.                       fprintf(stderr, "Impossible de reallouer la taille specifiee.\n" );
  36.                       return(-1);
  37.                  }
  38.             }
  39.        }
  40.        // On finit proprement la chaine
  41.        *(buffer + bufferindex++) = '\0';
  42.        // Conseil pour economiser les ressources:
  43.        // Dans bufferindex tu as la taille de la chaine,  
  44.        // Peut-être reallouer une dernière fois la memoire
  45.        // de la chaine avec bufferindex comme taille, pour
  46.        // allouer juste ce qu'il faut de mémoire, pas plus...
  47.        
  48.        printf("%s. index = %d, max_size =  %d.\n", buffer, bufferindex, bufferlen);
  49.    
  50.        free(buffer);
  51.        
  52.        return(0);
  53.   }


Message édité par SiliconGhost le 11-05-2003 à 14:03:44
n°389709
Profil sup​primé
Posté le 11-05-2003 à 14:55:58  answer
 

Merci bocou a tous. J'ai retenu la solution de ++Taz qui me semble la plus élaborée...
 
Merci pour votre aide cela me rend bocou service !!!
 
+++

n°391377
Taz
bisounours-codeur
Posté le 13-05-2003 à 09:48:01  profilanswer
 

bon fini de jouer: pour ce qui sosnt sous systèmes GNU
 
>>> man getline

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C]Taille de chaine de caractères dynamique...

 

Sujets relatifs
[Windows] qui transforme un Float en une chaine de chary a-t-il une taille limite pour un .string ou un .ascii?
verifier le 1er char d'une chainePERL : recuperer les 250 premiers caracteres d'un fichier...
Recherche d'un mot dans une chaine de caractere ?conversion d'une chaine de caractere en nombre
tableau dynamiqueTaille d'un GTK COMBO
SQL sous VBA : comparaison entre 1 chaîne et 1 valeur numériqueTaille d'une popup
Plus de sujets relatifs à : [C]Taille de chaine de caractères dynamique...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR