[C] erreur bête

erreur bête [C] - Programmation

Marsh Posté le 28-07-2003 à 11:16:40    

J'ai à moitié honte car je n'arrive pas à trouver le bug la dedans:
 

Code :
  1. #define _GNU_SOURCE
  2. #include <string.h>
  3. int
  4. main (void)
  5. {
  6.   char *buf;
  7.   buf = strdup("Test ca marche\n" );
  8.   printf("%s\n", get_token(buf, 256));
  9.   free(buf);
  10.   return 0;
  11. }
  12. char *
  13. get_token (char *str, int max)
  14. {
  15.   char *buf;
  16.   buf = malloc(max);
  17.   if(!buf)
  18.     return NULL;
  19.   while(!isblank(*str) && max--)
  20.     *buf++ = *str++;
  21.   *buf = '\0';
  22.   return buf;
  23. }

 
 
D'ailleur, je fais un malloc sans free dans get_token, je le mets où le free ?

Reply

Marsh Posté le 28-07-2003 à 11:16:40   

Reply

Marsh Posté le 28-07-2003 à 11:18:15    

avant meme de lire, man strtok.
 
edit: ben ç t'oblige à mémoriser le résultat, puis faire ton printf, puis faire un free
 
edit1: pour ton problème. et bien dans ta boucle while de recopie, pense  aussi à t'arreter si tu trouves un '\0' dans src. manque un <stdio.h> et un const pour faire faire const char *src


Message édité par Taz le 28-07-2003 à 11:21:37
Reply

Marsh Posté le 28-07-2003 à 11:20:36    

tu alloues de la memoire dans ta fonction get_token , et tu retournes ce pointeur.
 
Comme tu utilises cette fonction dans ton printf , tu perds l adresse de ton pointeur du coup tu ne peux pas le liberer.
 
 

Reply

Marsh Posté le 28-07-2003 à 11:20:54    

Et strtok t'as essayé?


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 11:29:05    

En fait, ce que je voudrais faire c'est avancer dans buf à chaques mots récupérés. Exemple si je fais
 

Code :
  1. printf("%s\n", get_token(lbuf));
  2. printf("%s\n", get_token(lbuf));

 
Il m'affiche:
 

Code :
  1. Test
  2. ca

Reply

Marsh Posté le 28-07-2003 à 11:30:31    

man strtok
 
dernière fois avant sanction (ça va je suis crédible là?)

Reply

Marsh Posté le 28-07-2003 à 11:31:32    

Taz a écrit :

man strtok


 [:plusun]  

Taz a écrit :


dernière fois avant sanction (ça va je suis crédible là?)


 
Arréte après tu va avoir mauvaise réputation  [:ddr555]


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 11:32:38    

LetoII a écrit :


 [:plusun]  
 
 
Arréte après tu va avoir mauvaise réputation  [:ddr555]  


Il aime ça, c'est pas grave! (cf who's who)

Reply

Marsh Posté le 28-07-2003 à 11:36:01    

Désolé pour strtok, le problème c'est que j'obtiens
 

Code :
  1. Test
  2. Test

 
pour
 

Code :
  1. printf("%s\n", strtok(buf, " " ));
  2.   printf("%s\n", strtok(buf, " " ));

 
Autre chose, on ne peut spécifier le nombre de caractère que l'on veut ce qui m'embêtre vraiment.
 
PS: J'ai lu le man de strtok et cela ne devrait pas donner Test\nTest

Reply

Marsh Posté le 28-07-2003 à 11:38:05    

non tu as pas lu  :pfff:

Reply

Marsh Posté le 28-07-2003 à 11:38:05   

Reply

Marsh Posté le 28-07-2003 à 11:38:31    

Code :
  1. printf("%s",strtok(buff," " ));
  2. printf("%s",strtok(NULL," " ));


 
Si mes souvenirs sont bons.


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 11:42:46    

tes souvenirs sont bons

Citation :

Example
/* STRTOK.C: In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */
 
#include <string.h>
#include <stdio.h>
 
char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;
 
void main( void )
{
   printf( "%s\n\nTokens:\n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}
 
Output
A string   of ,,tokens
and some  more tokens
 
Tokens:
 A
 string
 of
 tokens
 and
 some
 more
 tokens
 

Reply

Marsh Posté le 28-07-2003 à 11:55:57    

Rah, je suis un gros boulay, merci.
Et sinon pour limiter la taille, une idée ?

Reply

Marsh Posté le 28-07-2003 à 11:57:40    

deviant a écrit :

Rah, je suis un gros boulay, merci.
Et sinon pour limiter la taille, une idée ?


 

Code :
  1. Buffer[taille] ='\0';


 
 [:ddr555]


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 13:45:09    

Ca n'empêche pas un dépassement de la mémoire ça...

Reply

Marsh Posté le 28-07-2003 à 13:49:29    

deviant a écrit :

Ca n'empêche pas un dépassement de la mémoire ça...


 
Ben programme correctement et t'aura pas d'enuies  [:spamafote]  
 
strtok s'arréte au premier \0 qu'elle trouve, si t'en met un à la fin de ton buffer elle poura pas dépasser.


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 13:58:23    

C'est pas une question de coder proprement où pas (enfin si justment).
Prend cet exemple tout bête:
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int
  4. main (void)
  5. {
  6.     char buf[2];
  7.     char *line, *buf_ptr;
  8.     buf_ptr = buf;
  9.    
  10.     line = strdup("Voilaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ma chaine super longue\n" );
  11.     buf_ptr = strtok(line, " " );
  12.     printf("%s\n", buf);
  13.     free(line);
  14.     return 0;
  15. }

 
Il va y avoir un beau dépassement et vu que dans mon programme je ne contrôle pas le contenu de line.
A moins bien sûr que buf est la même taille que line et la il n'y a pas de problèmes...

Reply

Marsh Posté le 28-07-2003 à 14:00:24    

c'est un troll?

Reply

Marsh Posté le 28-07-2003 à 14:01:40    

Non, j'ai dis quoi comme connerie.

Reply

Marsh Posté le 28-07-2003 à 14:03:28    

Ah, je crois que je viens de comprendre, il s'arrête au premier \0 de buf donc la oui il ne peut pas dépasser.

Reply

Marsh Posté le 28-07-2003 à 14:08:14    

:pt1cable:  
 
C pas au niveau de strtok que tu doit faire gaffe au dépassement, mais avant.


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 14:10:43    

peut etre que cette nuit les tableaux sont devenus des l-values qui sait    [:spamafote]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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