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

 


Dernière réponse
Sujet : [C] erreur bête
Taz peut etre que cette nuit les tableaux sont devenus des l-values qui sait    [:spamafote]

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Taz peut etre que cette nuit les tableaux sont devenus des l-values qui sait    [:spamafote]
LetoII :pt1cable:  
 
C pas au niveau de strtok que tu doit faire gaffe au dépassement, mais avant.
deviant 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.
deviant Non, j'ai dis quoi comme connerie.
Taz c'est un troll?
deviant 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...

LetoII

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.

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

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]

deviant Rah, je suis un gros boulay, merci.
Et sinon pour limiter la taille, une idée ?
polo021 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
 

LetoII

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


 
Si mes souvenirs sont bons.

Taz non tu as pas lu  :pfff:
deviant 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

skeye

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)

LetoII

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]

Taz man strtok
 
dernière fois avant sanction (ça va je suis crédible là?)
deviant 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

LetoII Et strtok t'as essayé?
xilebo 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.
 
 
Taz 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
deviant 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 ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)