[C] passage par adresse de chaines de caracteres (résolu)

passage par adresse de chaines de caracteres (résolu) [C] - C - Programmation

Marsh Posté le 22-06-2010 à 22:44:19    

Salut a tous !!
 
J'ai un p'tit bout de code qu'est récalcitrant, j'arrive pas a comprendre ce qui se passe mal !!
En gros le programme comprends une fonction qui lit un fichier XML a la recherche de balise <a> et <b> (1 seule occurrence de chaque balise et <a> est avant <b> ) : les arguments de cette fonction sont le fichier a lire, les adresse des chaines contenant respectivement la balise A et celle contenant la balise B...
 
Voici le fichier que je veux lire :

Code :
  1. Ceci est le fichier a lire
  2. <a>aze</a>
  3. <toto>titi</toto>
  4. <b>qsd</b>
  5. <c>vbn</c>


 
Le pb est que, en sortie de ma fonction de lecture, j'ai bien mes 2 balises, mais dans le main, ou l'appel à la fonction est fait, il manque la balise <a> !
Il me manque aussi pas mal de cheveux  :(  
 
Voila le source et le résultat de l'exec : si qqn a une idée, je lui en serais très reconnaissant !!
 

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. FILE *p;
  5. char lire_car() {
  6.    return(fgetc(p));
  7. }
  8. void trouve_balise(char *file, char **balise_a, char **balise_b) {
  9.    char car;
  10.    char a[20];
  11.    char b[20];
  12.    p = fopen(file,"r" );
  13.    if (p != NULL) {
  14.       car = lire_car();
  15.       while (car != EOF) {
  16.          if (car == '<') {
  17.             car = lire_car();
  18.             if (car == 'a') {
  19.                car = lire_car();
  20.                if (car == '>') {
  21.                   car = lire_car();
  22.                   int i = 0;
  23.                   while (car != '<') {
  24.                      a[i++] = car;
  25.                      car = lire_car();
  26.                   }
  27.                   a[i] = '\0';
  28.                }
  29.             }
  30.             if (car == 'b') {
  31.                car = lire_car();
  32.                if (car == '>') {
  33.                   car = lire_car();
  34.                   int j = 0;
  35.                   while (car != '<') {
  36.                      b[j++] = car;
  37.                      car = lire_car();
  38.                   }
  39.                   b[j] = '\0';
  40.                }
  41.             }
  42.          }
  43.          car = lire_car();
  44.       }
  45.    }
  46.    *balise_a=a;
  47.    *balise_b=b;
  48.    printf("fonction :\n<a> contient %s.\n<b> contient %s.\n",*balise_a,*balise_b);
  49. }
  50. int main(int argc, char **argv) {
  51.    char *A = NULL;
  52.    char *B = NULL;
  53.    trouve_balise("aze.txt",&A,&B);
  54.    printf("main :\n<a> contient %s.\n<b> contient %s.\n",A,B);
  55.    exit(0);
  56. }


 
Resultat : a est vide dans le main ! comprends pas  :heink:  

Code :
  1. fonction :
  2. <a> contient aze.
  3. <b> contient qsd.
  4. main :
  5. <a> contient .
  6. <b> contient qsd.


 
Merci d'avance !!


Message édité par garoju le 23-06-2010 à 09:37:47

---------------
>>feed-back<<  >>a vendre<<
Reply

Marsh Posté le 22-06-2010 à 22:44:19   

Reply

Marsh Posté le 23-06-2010 à 08:23:34    

Tu mets dans balise_a et balise_b l'adresse de variables locales.  Apres le retour de trouve_balise, ces variables n'existent plus et n'importe quoi peut arriver.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-06-2010 à 09:26:19    

rhoooo....clair !!
 
Du coup, je déporte l'allocation dans le main et je supprime mes variables locales a et b et je travaille directement sur les adresses **balise_a et **balise_b. Mais ca part en seg fault !
Je pense me planter dans l'affectation de chaque caractère lu a mes 2 chaines, mais j'arrive pas a mettre le doigt dessus !
 

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. FILE *p;
  5. char lire_car() {
  6.    return(fgetc(p));
  7. }
  8. void trouve_balise(char *file, char **balise_a, char **balise_b) {
  9.    char car;
  10.    p = fopen(file,"r" );
  11.    if (p != NULL) {
  12.       car = lire_car();
  13.       while (car != EOF) {
  14.          if (car == '<') {
  15.             car = lire_car();
  16.             if (car == 'a') {
  17.                car = lire_car();
  18.                if (car == '>') {
  19.                   car = lire_car();
  20.                   int i = 0;
  21.                   while (car != '<') {
  22.                      *balise_a[i++] = car;
  23.                      car = lire_car();
  24.                   }
  25.                   *balise_a[i] = '\0';
  26.                }
  27.             }
  28.             if (car == 'b') {
  29.                car = lire_car();
  30.                if (car == '>') {
  31.                   car = lire_car();
  32.                   int j = 0;
  33.                   while (car != '<') {
  34.                      *balise_b[j++] = car;
  35.                      car = lire_car();
  36.                   }
  37.                   *balise_b[j] = '\0';
  38.                }
  39.             }
  40.          }
  41.          car = lire_car();
  42.       }
  43.    }
  44.    printf("fonction :\n<a> contient %s.\n<b> contient %s.\n",*balise_a,*balise_b);
  45. }
  46. int main(int argc, char **argv) {
  47.    char *A = (char *) malloc(20*sizeof(char));
  48.    char *B = (char *) malloc(20*sizeof(char));
  49.    trouve_balise("aze.txt",&A,&B);
  50.    printf("main :\n<a> contient %s.\n<b> contient %s.\n",A,B);
  51.    exit(0);
  52. }

Reply

Marsh Posté le 23-06-2010 à 09:29:18    

*balise_a[i] est interprete comme *(balise_a[i]) et pas (*balise_a)[i] comme ton code le suppose.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-06-2010 à 09:33:32    

Résolu !! Merci mille fois  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:


---------------
>>feed-back<<  >>a vendre<<
Reply

Marsh Posté le 24-06-2010 à 11:06:14    

Au passage si tu veux utiliser le C pour lire des fichiers dont tu connais la dtd je te conseille de jeter un oeil à lexx et yacc

Reply

Marsh Posté le 24-06-2010 à 11:46:36    

J'en prends bonne note merci !! Lexx...que de vieux souvenirs avec ça !!

Reply

Sujets relatifs:

Leave a Replay

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