IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème chaînes


Sujet :

C

  1. #1
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut Problème chaînes
    Bonjour j'essaye de faire un truc, voilà une explication,

    Par exemple j'ai:
    Ligne = <balise> coolcoolcool<balise> hahahah<balise>...
    Ma fonction ExtractData dois me rendre: coolcoolcool seulement, et alors ca va pas :s, et j'ai une erreur à chaque fois que je lance le programme, en me disant que mon programme à rencontrer un bug...bla bla bla

    Voilà le code de ma fonction: (peut etre l'algo n'est pas bon ou je me suis gouré quelque part mais j'vois pas :$, je m'arache avec ca depuis midi lol)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    char* ExtractData (char* buf, int pos){
    //Extrait une donnée d'une ligne en ignorant les balises html
    //return: char*
          char *data;// chaine à retourner
     
          data = malloc (LINE*sizeof(char));//j'alloue la memoire necessaire
          memcpy (data, 0, sizeof(data)); // je remplie avec des zero
           while(1){//Boucle infinie pour ignorer les balise
              if (buf[pos]=='<'){
                   while ((buf[pos]!='\0')&&(buf[pos]!='>'))
                        pos++;  
                       pos++;             
                      }
                    else//quand j'ai plus de balises je quitte ma boucle
                      break;
                      }
     
               while ((buf[pos]!='<')&&(buf[pos]!='\0')){ 
                 data = addChar(data, buf[pos]); // je recupere le caractere
                 pos++;
                 }
                printf ("%s\n",data); 
             return data;
          }
    ma fonction addChar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char* addChar (char* data, char C){
    //Ajoute le caractere C a la chaine data
    //return: char*
         char* tmp = data;
     
          sprintf(tmp,data, C); 
           return (tmp);
          }
    Voilà comment j'appel ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int BuiltBBCode (void){
     
         char *Line, *data;
         int cpt=0;
     
             Line = malloc (LINE*sizeof (char));
             data = malloc (LINE*sizeof (char));
     
         while (fgets(Line, LINE, src)!=NULL){ 
            data = ExtractData (Line, cpt); // extraire la donnée a la position cpt
          if(fputs (data ,dest)==EOF){// j'écrit ma donné en sortie
             printf("error");
              return -1;         
                        }  
                  cpt++;  
                 fflush (dest);//ecriture immediate du tompon
                      } 
             return 0; 
         }
    Merçi
    Compil your life guy!
    The Aures Project

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Alors j'ai juste regarder la fonction addChar
    Pour sprintf tu as regarder le man de la fonction? Je suis pas sur parce que la je suis pas bien sur que ca fonctionne.

    Apres le reste j'ai pas regardé...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    juste deux choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    data = malloc (LINE*sizeof(char));//j'alloue la memoire necessaire 
    memcpy (data, 0, sizeof(data)); // je remplie avec des zero
    Ou est défini LINE ?

    Ta deuxième instruction ne sert à rien, utilise un calloc au lieu de ton malloc, du coup tu combines les deux instructions.

    J'aurai aussi la même remarque que skyrunner.

    Enfin, si t'a possibilité d'afficher la chaine data à la fin pour voir ce qu'il y a dedant, ça peut peut être aider.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 81
    Points
    81
    Par défaut
    Pour vider le buff du printf ce serait pas plutot fflush(stdout) ?
    Par ailleur a quoi correspond ton dest?
    Sinon comme skyrunner je comprend pas trop le sprintf.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par PRomu@ld
    juste deux choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    data = malloc (LINE*sizeof(char));//j'alloue la memoire necessaire 
    memcpy (data, 0, sizeof(data)); // je remplie avec des zero
    De toute façon le memset ne fait pas ce que pense le P.O. : sizeof(data) = sizeof(un pointeur) surement différent de LINE, d'ailleurs je vois la faute, c'est memcpy qui est écrit et non pas memset !!!!
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Problème chaînes
    Citation Envoyé par Goundy
    Voilà le code de ma fonction:
    On est obligé de se taper 40.000 erreurs à corriger ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Compiling: main.c
    main.c:1: warning: no previous prototype for 'ExtractData'
    main.c: In function `ExtractData':
    main.c:6: error: implicit declaration of function `malloc'
    main.c:6: warning: nested extern declaration of `malloc'
    <internal>:0: warning: redundant redeclaration of 'malloc'
    main.c:6: error: `LINE' undeclared (first use in this function)
    main.c:6: error: (Each undeclared identifier is reported only once
    main.c:6: error: for each function it appears in.)
    main.c:7: error: implicit declaration of function `memcpy'
    main.c:7: warning: nested extern declaration of `memcpy'
    <internal>:0: warning: redundant redeclaration of 'memcpy'
    main.c:7: warning: null argument where non-null required (arg 2)
    main.c:19: error: implicit declaration of function `addChar'
    main.c:19: warning: nested extern declaration of `addChar'
    main.c:19: warning: assignment makes pointer from integer without a cast
    main.c:22: error: implicit declaration of function `printf'
    main.c:22: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c: At top level:
    main.c:26: warning: no previous prototype for 'addChar'
    main.c:26: error: conflicting types for 'addChar'
    main.c:19: error: previous implicit declaration of 'addChar' was here
    main.c: In function `addChar':
    main.c:31: error: implicit declaration of function `sprintf'
    main.c:31: warning: nested extern declaration of `sprintf'
    <internal>:0: warning: redundant redeclaration of 'sprintf'
    main.c:31: warning: format not a string literal, argument types not checked
    main.c: At top level:
    main.c:36: warning: no previous prototype for 'BuiltBBCode'
    main.c: In function `BuiltBBCode':
    main.c:41: warning: nested extern declaration of `malloc'
    <internal>:0: warning: redundant redeclaration of 'malloc'
    main.c:41: error: `LINE' undeclared (first use in this function)
    main.c:44: error: implicit declaration of function `fgets'
    main.c:44: warning: nested extern declaration of `fgets'
    main.c:44: error: `src' undeclared (first use in this function)
    main.c:44: error: `NULL' undeclared (first use in this function)
    main.c:46: error: implicit declaration of function `fputs'
    main.c:46: warning: nested extern declaration of `fputs'
    <internal>:0: warning: redundant redeclaration of 'fputs'
    main.c:46: error: `dest' undeclared (first use in this function)
    main.c:46: error: `EOF' undeclared (first use in this function)
    main.c:47: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    main.c:51: error: implicit declaration of function `fflush'
    main.c:51: warning: nested extern declaration of `fflush'
    Process terminated with status 1 (0 minutes, 0 seconds)
    Avec ce fichier d'entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    abcd 123
    efg 4567
    et ce code (quelques corrections faites),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #define LINE 128
     
    static char* addChar (char* data, int C){
       //Ajoute le caractere C a la chaine data
       //return: char*
     
       sprintf(data, "%s%c", data, C);
       return data;
    }
     
    static char* ExtractData (char* buf, int pos){
       //Extrait une donnée d'une ligne en ignorant les balises html
       //return: char*
       char *data; // chaine à retourner
     
       data = malloc (LINE * sizeof(char)); //j'alloue la memoire necessaire
       memset (data, 0, sizeof(data)); // je remplie avec des zero
       while (1)
       { //Boucle infinie pour ignorer les balise
          if (buf[pos] == '<')
          {
             while ((buf[pos] != '\0') && (buf[pos] != '>'))
                pos++;
             pos++;
          }
          else //quand j'ai plus de balises je quitte ma boucle
             break;
       }
     
       while ((buf[pos] != '<') && (buf[pos] != '\0'))
       {
          data = addChar(data, buf[pos]); // je recupere le caractere
          pos++;
       }
       printf ("%s\n", data);
       return data;
    }
     
     
    static int BuiltBBCode (FILE *src, FILE *dest)
    {
       char *Line, *data;
       int cpt = 0;
     
       Line = malloc (LINE * sizeof (char));
       data = malloc (LINE * sizeof (char));
     
       while (fgets(Line, LINE, src) != NULL)
       {
          data = ExtractData (Line, cpt); // extraire la donnée a la position cpt
          if (fputs (data , dest) == EOF)
          { // j'écrit ma donné en sortie
             printf("error");
             return -1;
          }
          cpt++;
          fflush (dest); //ecriture immediate du tompon
       }
       return 0;
    }
     
    int main (void)
    {
    #define f_src "data.txt"
     #define f_dest "out.txt"
     
       FILE *src = fopen(f_src, "r");
       if (src != NULL)
       {
          FILE *dest = fopen(f_dest, "w");
          if (dest != NULL)
          {
             int err = BuiltBBCode (src, dest);
     
     
          }
          else
          {
             perror(f_dest);
          }
       }
       else
       {
          perror(f_src);
       }
    }
    j'obtiens la sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (85 rec)
    SYSALLOC Successful initialization: 85 records available
    abcd 123
     
    fg 4567
     
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 003D2548 (128 bytes) malloc'ed at line 55 of 'main.c' not freed
    SYSALLOC Bloc 003D25D0 (128 bytes) malloc'ed at line 56 of 'main.c' not freed
    SYSALLOC Bloc 003D2658 (128 bytes) malloc'ed at line 26 of 'main.c' not freed
    SYSALLOC Bloc 003D26E0 (128 bytes) malloc'ed at line 26 of 'main.c' not freed
    SYSALLOC Released Memory
    FRMWRK.Termine
     
    Press ENTER to continue.
    et le fichier de sortie
    Je trouve déjà que ça fait beacoup de fuites mémoires pour 2 lignes de texte sans balises...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Bonjour,

    Mr EMM: Non, vous n'êtes pas obligé et d'ailleurs 40000€ c'est beaucoup^^

    Sinon pour mon LINE il est définie étant 256

    J'ai pas poster tout le code, car je me suis dis que l'erreur sera peut être clair pour vous, de plus c'est vrai que le sprintf() ne fonctionne pas, c'est bizzare car j'ai essayer pas mal de solutions mais j'arrive pas à ajouter un bête caractère à une chaîne de caractères.

    Mais graçe à vous, ca marche maintenant lol, de plus j'avais confendus memcpy avec memset, et mal utilisé sprintf().

    Merçi à tous , ca aide trop developpez.com
    Compil your life guy!
    The Aures Project

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] problème chaîne de connexion MySql/Odbc5.2 + procédure stockée
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/10/2014, 11h17
  2. [AC-2007] problème chaîne sql
    Par doumbix dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/05/2011, 09h06
  3. Problème : chaîne de caractère
    Par kurt12 dans le forum C
    Réponses: 3
    Dernier message: 26/04/2006, 23h08
  4. Problème chaîne de caractères
    Par lionelpopo dans le forum Langage
    Réponses: 5
    Dernier message: 20/04/2006, 11h51
  5. Problème de chaîne de caractères (BSTR)
    Par patvdb dans le forum MFC
    Réponses: 2
    Dernier message: 26/02/2004, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo