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

  FORUM HardWare.fr
  Programmation
  C

  Probleme re-initialisation d'une chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme re-initialisation d'une chaine

n°1664193
KspR92
Membre Fantômik!
Posté le 31-12-2007 à 00:51:46  profilanswer
 

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
mood
Publicité
Posté le 31-12-2007 à 00:51:46  profilanswer
 

n°1664208
Elmoricq
Modérateur
Posté le 31-12-2007 à 09:26:22  profilanswer
 

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
n°1664230
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-12-2007 à 12:45:59  profilanswer
 

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/
n°1664252
Elmoricq
Modérateur
Posté le 31-12-2007 à 14:06:40  profilanswer
 

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.

n°1664280
KspR92
Membre Fantômik!
Posté le 31-12-2007 à 14:56:44  profilanswer
 

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
n°1666275
KspR92
Membre Fantômik!
Posté le 05-01-2008 à 00:51:05  profilanswer
 

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
n°1666281
tpierron
Posté le 05-01-2008 à 01:33:56  profilanswer
 

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

n°1666282
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-01-2008 à 01:36:59  profilanswer
 

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/

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

  Probleme re-initialisation d'une chaine

 

Sujets relatifs
[C] Urgent probleme affichage entre ``probleme d'installation d'un annuaire FreeGlobes
Problème code VBAAide pour problème sur site php
probleme avec jboss 4.2[VB] Probleme avec compte non-admin.
Problème pour empiler des structures[Struts]Probleme récupération de la valeur d'un html:select
Probléme avec fonction foreachProbleme avec Pied de page
Plus de sujets relatifs à : Probleme re-initialisation d'une chaine


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