Probleme re-initialisation d'une chaine

Probleme re-initialisation d'une chaine - C - Programmation

Marsh Posté le 31-12-2007 à 00:51:46    

Salut à tous :hello:
 
Voila mon problème, je dispose d'un fichier texte de ce type duquelle je dois extraire l'extension repéré en rouge :

Citation :

335.946.10-56.gar.gaoland.net - - [05/Dec/2005:02:46:52 +0310] 400 2 "http://128.752.489.732:47081/bool.xml" "FearFactor Croowling"


 
Pour cela, j'ai écrit ce programme :
 

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* log=fopen("lig","r" );
  5. char c,ligne[512],temp[5];
  6. int i=0,j=0;
  7. while(fgets(ligne,512, log) != NULL)
  8.      {
  9.      while(ligne[i] != ' ')
  10.            {
  11.            if(ligne[i] == '.')
  12.                {
  13.                temp[0] = '\0';
  14.                j = 0;
  15.                }
  16.            else
  17.                {
  18.                temp[j] = ligne[i];
  19.                j++;
  20.                }
  21.            i++;
  22.            }
  23.      printf("%s\n",temp);             
  24.      }
  25. fclose(log);
  26. system("PAUSE" );
  27. return 0;
  28. }


 
Mais qui me donne cela une fois executé :

Citation :

netland


 
Je suppose que sa doit venir de la ligne 15, mais je me suis retourné la tête que je ne vois toujours pas l'erreur.
 
Merci à vous!!!
 
Edit : Mouarf, sa passe pas les commentaires, je les retireraient demain matin pour la lisibilité.


Message édité par KspR92 le 31-12-2007 à 12:56:52

---------------
My FeedBack
Reply

Marsh Posté le 31-12-2007 à 00:51:46   

Reply

Marsh Posté le 31-12-2007 à 09:26:22    

Utilise plutôt strchr() pour faire la recherche de ton caractère '.', ça t'évitera cette tambouille. [:dawa]
 
Ensuite, tu devrais contrôler la taille de ce que tu insères dans temp.
Lorsque tu y entres "gaoland", tu dépasses de 3 caractères la taille du buffer, ce qui provoque des débordements mémoires => comportement aléatoire.
 
Enfin, tu ne termines ta chaîne avec '\0' que si tu trouves un '.'.
Or, il faut également terminer "temp" lorsque tu as terminé la lecture en trouvant un espace.
 
Donc, déroulement de ton programme (je passe les premières lectures) :
- tu trouves le '.' de ".gaoland"
- tu stockes "gaoland\0" dans temp (avec débordement mémoire, donc)
- tu trouves le '.' de ".net"
- tu stockes "net" dans la chaîne temp qui contenait "gaoland\0" => temp == "netland\0"

Message cité 1 fois
Message édité par Elmoricq le 31-12-2007 à 09:27:03
Reply

Marsh Posté le 31-12-2007 à 12:45:59    

Elmoricq a écrit :

Utilise plutôt strchr() pour faire la recherche de ton caractère '.', ça t'évitera cette tambouille.


ou plutôt strrchr(), puisqu'il s'agit de trouver le dernier '.'...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 31-12-2007 à 14:06:40    

En fait j'ai l'impression que le nombre de '.' dans le message informatif peut être variable, alors que celui de la chaîne d'en-tête est fixe.
Donc je ne pense pas que strrchr() soit une bonne idée, sauf à employer d'abord strchr() pour trouver le premier espace, puis strrchr() pour trouver le dernier point précédent cet espace.

Reply

Marsh Posté le 31-12-2007 à 14:56:44    

Exact, il fallait mettre temp[j] = '\0'; après qu'il ait trouvé ' '.
Merci à vous!!!
Pour ce qui est de strchr(), je verrais sa à la fin pour le simplifier, pour l'instant je garde mes premiers objectifs.


Message édité par KspR92 le 31-12-2007 à 14:57:16

---------------
My FeedBack
Reply

Marsh Posté le 05-01-2008 à 00:51:05    

Re-Salut!!!
 
J'ai un autre soucis maintenant avec des pointeurs vers un tableau de structures.

Code :
  1. typedef struct
  2. {
  3.     char ext[20];
  4.     int nb;
  5. }extension;
  6. void saisie_extension(FILE *log,extension *liste[],int *nb);
  7. void plus_frequente(int *nb,extension *liste[]);
  8. int main()
  9. {
  10. FILE* log=fopen("liste","r" );
  11. extension liste[8000];
  12. saisie_extension(log,&liste,&nb);
  13. plus_frequente(&nb,&liste);
  14. fclose(log);
  15. system("PAUSE" );
  16. }


 
Le compilateur m'indique un Warning en me disant que les pointeurs (en rouge) sont incompatibles. Et même lorsqu'il compile le programme plante.
J'ai beau me creuser la tête, je n'arrive pas à savoir pourquoi c'est faux!?!
 
Merci à vous!


---------------
My FeedBack
Reply

Marsh Posté le 05-01-2008 à 01:33:56    

Hmm, révise tes bases du C, particulièrement la section tableau. &liste pour un tableau n'a aucun sens, vu que liste est un déjà un pointeur (constant).
 
Qui plus est, lorsque tu écris "extension * liste[]" dans un prototype (et uniquement dans un prototype), c'est strictement équivalent à "extension ** liste".

Reply

Marsh Posté le 05-01-2008 à 01:36:59    

KspR92 a écrit :

Code :
  1. typedef struct
  2. {
  3.     char ext[20];
  4.     int nb;
  5. }extension;
  6. void saisie_extension(FILE *log,[# ff0e00]extension *liste[][/#ff0e00],int *nb);
  7. void plus_frequente(int *nb,[# ff0000]extension *liste[][/#ff0000]);
  8. int main()
  9. {
  10. FILE* log=fopen("liste","r" );
  11. extension liste[8000];
  12. saisie_extension(log,[# ff0e00]&liste[/#ff0e00],&nb);
  13. plus_frequente(&nb,[# ff0000]&liste[/#ff0000]);
  14. fclose(log);
  15. system("PAUSE" );
  16. }




Faut pas peindre le code... après on passe des heures à gratter la peinture...
Par contre, il serait beaucoup plus utile de poster du code compilable...


Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:7: error: syntax error before '*' token
main.c:7: warning: function declaration isn't a prototype
main.c:11: warning: function declaration isn't a prototype
main.c: In function `main':
main.c:12: error: `FILE' undeclared (first use in this function)
main.c:12: error: (Each undeclared identifier is reported only once
main.c:12: error: for each function it appears in.)
main.c:12: error: `log' undeclared (first use in this function)
main.c:12: warning: implicit declaration of function `fopen'
main.c:14: error: `nb' undeclared (first use in this function)
main.c:15: warning: passing arg 2 of `plus_frequente' from incompatible pointer type
main.c:16: warning: implicit declaration of function `fclose'
main.c:17: warning: implicit declaration of function `system'
Process terminated with status 1 (0 minutes, 0 seconds)
6 errors, 6 warnings


Ce code

Code :
  1. #include <stdio.h>
  2. typedef struct
  3. {
  4.    char ext[20];
  5.    int nb;
  6. }
  7. extension;
  8. void saisie_extension (FILE * log, extension * liste[], int *nb);
  9. void plus_frequente (int *nb, extension * liste[]);
  10. int main (void)
  11. {
  12.    FILE *log = fopen ("liste", "r" );
  13.    extension liste[8000];
  14.    saisie_extension (log, &liste, &nb);
  15.    plus_frequente (&nb, &liste);
  16.    fclose (log);
  17.    system ("PAUSE" );
  18. }


est incomplet


Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c: In function `main':
main.c:17: error: `nb' undeclared (first use in this function)
main.c:17: error: (Each undeclared identifier is reported only once
main.c:17: error: for each function it appears in.)
main.c:17: warning: passing arg 2 of `saisie_extension' from incompatible pointer type
main.c:18: warning: passing arg 2 of `plus_frequente' from incompatible pointer type
main.c:20: warning: implicit declaration of function `system'
Process terminated with status 1 (0 minutes, 0 seconds)
3 errors, 3 warnings


Message édité par Emmanuel Delahaye le 05-01-2008 à 01:40:13

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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