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

  FORUM HardWare.fr
  Programmation
  C

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

 

Sujet(s) à lire :
    - passage par adresse, malloc et free.
 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2003926
garoju
Posté le 22-06-2010 à 22:44:19  profilanswer
 

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<<
mood
Publicité
Posté le 22-06-2010 à 22:44:19  profilanswer
 

n°2003970
Un Program​meur
Posté le 23-06-2010 à 08:23:34  profilanswer
 

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)
n°2003986
garoju
Posté le 23-06-2010 à 09:26:19  profilanswer
 

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

n°2003987
Un Program​meur
Posté le 23-06-2010 à 09:29:18  profilanswer
 

*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)
n°2003989
garoju
Posté le 23-06-2010 à 09:33:32  profilanswer
 

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


---------------
>>feed-back<<  >>a vendre<<
n°2004386
Profil sup​primé
Posté le 24-06-2010 à 11:06:14  answer
 

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

n°2004409
garoju
Posté le 24-06-2010 à 11:46:36  profilanswer
 

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


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

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

 

Sujets relatifs
Petite image déco en arrière-plan -> positionnement ?(résolu... trop con) CHAINES supprimer xxx entre 'A' et 'B' ???
[RESOLU][vbs]access denied[Résolu] ereg() ><
ouverture d'un fichier en C[RESOLU] requette HTTP et chemin
programme débutant sur les chaînes.comment tester si le résultat de la requête est nul [résolu]
Plus de sujets relatifs à : [C] passage par adresse de chaines de caracteres (résolu)


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