Problème au niveau d'une chaîne de caractères

Problème au niveau d'une chaîne de caractères - C - Programmation

Marsh Posté le 18-04-2008 à 02:40:32    

Bonsoir à tous  :hello:

 

Je suis en première année d'école d'ingénieur, et je dois réaliser un programme qui teste une page html, et qui en tire les liens morts.

 

J'ai donc créé une première procédure qui teste un lien et qui dit s'il est bon ou pas :

 
Code :
  1. void lienbon(char **argv) {
  2.   char commande[100];
  3.   int coderetour=0;
  4.   sprintf(commande, "wget -q %s", argv[1]);
  5.   if(system(commande)==0) {
  6.     printf("le lien est bon\n" );
  7.   }
  8.   else {
  9.     printf("le lien est mort\n" );
  10.     coderetour=1; }
  11. }
 

J'ai déjà super galéré pour faire ça...

 

Ensuite j'ai créé une procédure qui scanne une page HTML pour en retirer tous les liens écrits de façon propre :

 
Code :
  1. void testpage ( FILE *fH ) {
  2.   Booleen encore = VRAI;
  3.   char c;
  4.   char *d;
  5.   char chaine[100]="\0";
  6.   while ( encore ) {
  7.     c = fgetc ( fH );
  8.     while ( c != EOF && c != '<' ) {
  9.       c = fgetc ( fH );
  10.     }
  11.     switch (c) {
  12.     case EOF : encore = FAUX;
  13.       break;
  14.     case '<' : if((c=fgetc(fH))=='a'){
  15.         while(c!='"'){
  16.           c=fgetc(fH);
  17.         }
  18.         c=fgetc(fH);
  19.       while(c!='"'){                       // boucle qui prend en compte le lien bien tapé
  20.         c=*d;                              // pour convertir un char en char * ??? Ca m'a l'air foireux, mais pourtant ça fait fonctionner strcat
  21.         strcat(chaine, d);
  22.         c=fgetc(fH);
  23.       }
  24.       printf("%s\n", chaine);           // affiche la chaine de caractère, pour vérifier qu'elle est bonne : ne fonctionne pas
  25.       //lienbon(chaine);                 // pour le moment, seulement en commentaire, parce que même le printf précédent ne marche pas...
  26.       printf("\n" );                         // simplement pour améliorer la mise en page
  27.       }
  28.       else encore=VRAI;
  29.     }
  30.   }
  31. }
 


Alors voilà mon premier problème : j'arrive à compiler le programme, mais quand je l'exécute, il me sort une bouillie de caractère, approximativement de la longueur de chaque lien cependant...

 

Donc il y a un soucis au niveau de la chaîne de caractère créée...

 

Je me dis que cela doit venir du fait que la fonction fgetc renvoie un entier, alors que "c" est un caractère à la base...

 

Je pense que la clé du soucis se trouve dans le fait que je doive convertir un char (ou un int ??? je ne sais plus) en char*. Mais malgré mes recherches, je n'y arrive pas.

 

Et là j'ai passé des heures là-dessus, je n'en peux plus, je suis vraiment à bout.  :sweat:  Une aide me ferait tellement du bien !  :jap:  :jap:


Message édité par bouldouman le 18-04-2008 à 02:42:50
Reply

Marsh Posté le 18-04-2008 à 02:40:32   

Reply

Marsh Posté le 18-04-2008 à 09:02:08    

Oui, strcat a besoin de deux chaines de caractères, c'est à dire de deux buffers terminés par un zéro.
Le problème est que c=*d;  ne va pas mettre un zéro à la fin.
Il faudrait faire ceci :

char d[2];
d[0] = c;
d[1] ='\0';


Message édité par olivthill le 18-04-2008 à 09:02:22
Reply

Marsh Posté le 18-04-2008 à 10:33:33    

Merci de ta réponse ! Effectivement je n'avais pas vu ce problème...
 
Mais là en fait je viens de demander de l'aide à un ami, et ça marche ! voici la version définitive (sans strcat en fait) :
 

Code :
  1. void testpage ( FILE *fH ) {
  2.   Booleen encore = VRAI;
  3.   char c;
  4.   int i=0;
  5.   char chaine[100]="\0";
  6.   while ( encore ) {
  7.     c = fgetc ( fH );
  8.     while ( c != EOF && c != '<' ) {
  9.       c = fgetc ( fH );
  10.     }
  11.     switch (c) {
  12.     case EOF : encore = FAUX;
  13.       break;
  14.     case '<' : if((c=fgetc(fH))=='a'){
  15. while(c!='"'){
  16.   c=fgetc(fH);
  17. }
  18. c=fgetc(fH);
  19. while(c!='"'){
  20.   chaine[i]=c;
  21.   i++;
  22.   c=fgetc(fH);
  23. }
  24. lienbon(chaine);
  25. printf("\n" );
  26. memset (chaine, 0, sizeof (chaine));     
  27. i=0;
  28.       }
  29.       else encore=VRAI;
  30.     }
  31.   }
  32. }


 
 
Et pour la procédure lienbon :
 

Code :
  1. void lienbon(char *argv) {
  2.   char commande[100];
  3.   int coderetour=0;
  4.   sprintf(commande, "wget -q %s", argv);
  5.   if(system(commande)==0) {
  6.     printf("le lien %s est bon\n", argv);
  7.   }
  8.   else {
  9.     printf("le lien %s est mort\n", argv);
  10.     coderetour=1; }
  11. }


 
 
Merci quand même ! A bientôt.
 

Reply

Sujets relatifs:

Leave a Replay

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