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

Taille de chaine de caractères dynamique... [C] - C++ - Programmation

Marsh Posté le 08-05-2003 à 10:58:04    

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++

Reply

Marsh Posté le 08-05-2003 à 10:58:04   

Reply

Marsh Posté le 08-05-2003 à 10:59:22    

ben fo faire un boule avec du realloc

Reply

Marsh Posté le 08-05-2003 à 11:04:52    

euhhhhhhh tu pourrai pas etre plus précis ?

Reply

Marsh Posté le 08-05-2003 à 11:09:46    

Reply

Marsh Posté le 08-05-2003 à 12:04:25    

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

Reply

Marsh Posté le 08-05-2003 à 13:33:59    

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

Reply

Marsh Posté le 08-05-2003 à 13:38:28    

ok merci bien je vais tester tout ca

Reply

Marsh Posté le 08-05-2003 à 20:22:57    

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
Reply

Marsh Posté le 08-05-2003 à 21:52:30    

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
Reply

Marsh Posté le 08-05-2003 à 22:00:10    

remplace ton define par  
 
const int N=2;

Reply

Marsh Posté le 08-05-2003 à 22:00:10   

Reply

Marsh Posté le 09-05-2003 à 11:37:00    

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. }

Reply

Marsh Posté le 09-05-2003 à 11:53:44    

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
Reply

Marsh Posté le 09-05-2003 à 12:01:21    

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

Reply

Marsh Posté le 09-05-2003 à 12:12:16    

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
Reply

Marsh Posté le 09-05-2003 à 12:23:09    

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

Reply

Marsh Posté le 09-05-2003 à 12:27:47    

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
Reply

Marsh Posté le 09-05-2003 à 12:31:47    

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

Reply

Marsh Posté le 09-05-2003 à 12:33:43    

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
Reply

Marsh Posté le 09-05-2003 à 12:36:12    

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

Reply

Marsh Posté le 09-05-2003 à 12:41:37    

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
Reply

Marsh Posté le 09-05-2003 à 12:46:26    

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é ;))

Reply

Marsh Posté le 09-05-2003 à 15:28:59    

++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)

Reply

Marsh Posté le 09-05-2003 à 16:02:05    

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...
 

Reply

Marsh Posté le 09-05-2003 à 16:16:04    

++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:

Reply

Marsh Posté le 10-05-2003 à 00:35:09    

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.

Reply

Marsh Posté le 10-05-2003 à 10:38:05    

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

Reply

Marsh Posté le 10-05-2003 à 10:56:12    

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

Reply

Marsh Posté le 10-05-2003 à 12:07:22    

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.   }

Reply

Marsh Posté le 10-05-2003 à 13:01:38    

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.       }

Reply

Marsh Posté le 10-05-2003 à 15:33:32    

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
Reply

Marsh Posté le 10-05-2003 à 16:44:18    

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.

Reply

Marsh Posté le 11-05-2003 à 12:19:32    

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.
Reply

Marsh Posté le 11-05-2003 à 12:21:37    

et quid de fgets?

Reply

Marsh Posté le 11-05-2003 à 12:56:18    

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

Reply

Marsh Posté le 11-05-2003 à 12:57:25    

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

Reply

Marsh Posté le 11-05-2003 à 13:09:06    

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

Reply

Marsh Posté le 11-05-2003 à 13:32:29    

ç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

Reply

Marsh Posté le 11-05-2003 à 13:54:13    

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
Reply

Marsh Posté le 11-05-2003 à 14:55:58    

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 !!!
 
+++

Reply

Marsh Posté le 13-05-2003 à 09:48:01    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed