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

  FORUM HardWare.fr
  Programmation

  [C] erreur bête

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] erreur bête

n°469516
deviant
Posté le 28-07-2003 à 11:16:40  profilanswer
 

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 ?

mood
Publicité
Posté le 28-07-2003 à 11:16:40  profilanswer
 

n°469521
Taz
bisounours-codeur
Posté le 28-07-2003 à 11:18:15  profilanswer
 

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
n°469526
xilebo
noone
Posté le 28-07-2003 à 11:20:36  profilanswer
 

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.
 
 

n°469527
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 11:20:54  profilanswer
 

Et strtok t'as essayé?


---------------
Le Tyran
n°469538
deviant
Posté le 28-07-2003 à 11:29:05  profilanswer
 

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

n°469542
Taz
bisounours-codeur
Posté le 28-07-2003 à 11:30:31  profilanswer
 

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

n°469546
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 11:31:32  profilanswer
 

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
n°469552
skeye
Posté le 28-07-2003 à 11:32:38  profilanswer
 

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)

n°469556
deviant
Posté le 28-07-2003 à 11:36:01  profilanswer
 

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

n°469560
Taz
bisounours-codeur
Posté le 28-07-2003 à 11:38:05  profilanswer
 

non tu as pas lu  :pfff:

mood
Publicité
Posté le 28-07-2003 à 11:38:05  profilanswer
 

n°469562
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 11:38:31  profilanswer
 

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


 
Si mes souvenirs sont bons.


---------------
Le Tyran
n°469568
polo021
Posté le 28-07-2003 à 11:42:46  profilanswer
 

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
 

n°469589
deviant
Posté le 28-07-2003 à 11:55:57  profilanswer
 

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

n°469590
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 11:57:40  profilanswer
 

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
n°469712
deviant
Posté le 28-07-2003 à 13:45:09  profilanswer
 

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

n°469716
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 13:49:29  profilanswer
 

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
n°469736
deviant
Posté le 28-07-2003 à 13:58:23  profilanswer
 

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

n°469740
Taz
bisounours-codeur
Posté le 28-07-2003 à 14:00:24  profilanswer
 

c'est un troll?

n°469743
deviant
Posté le 28-07-2003 à 14:01:40  profilanswer
 

Non, j'ai dis quoi comme connerie.

n°469747
deviant
Posté le 28-07-2003 à 14:03:28  profilanswer
 

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.

n°469754
LetoII
Le dormeur doit se réveiller
Posté le 28-07-2003 à 14:08:14  profilanswer
 

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


---------------
Le Tyran
n°469762
Taz
bisounours-codeur
Posté le 28-07-2003 à 14:10:43  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  [C] erreur bête

 

Sujets relatifs
Cherche erreur de syntaxe....[HTML/JS] URL demandée et erreur 404
Création d'un cookie - erreur débutantErreur de segmentation :/
ouverture d'une page dans une frame (erreur sur la page) [résolu]erreur dans ma synthaxe ?
erreur de find d'un recordsetASP | SPLIT | Ou est l'erreur ? :(
ou est mon erreurquestion bete sur les liens et les images
Plus de sujets relatifs à : [C] erreur bête


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