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 :

conversion char* en char[]?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut conversion char* en char[]?
    Bonjour,

    Encore une fois, j'aurais SVP besoin d'un peu d'aide...

    Mon programme principal instancie une structure du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct {
            char        *  Nom_projet; 
            char        *  Chemin;
            char        *  DataFile;
            int         *  TypeJeu;
            int         *  UseFilterFile;
            char        *  FilterFile;
            } Project_STRUCT;
    puis appelle une fonction qui lis un fichier .txt afin de compléter les champs du Projet_STRUCT...

    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
     
    int main (int argc, char ** argv)
    {
     
    /******** Creation des elements necessaires au Projet *************/
     
       Project_STRUCT * Projet   = malloc(sizeof(Project_STRUCT));
     
            Projet->Nom_projet     = NULL; 
            Projet->Chemin         = NULL;
            Projet->DataFile       = NULL;
            Projet->TypeJeu        = NULL;
            Projet->UseFilterFile  = NULL;
            Projet->FilterFile     = NULL;
     
      lecture_txt(Projet);
    }
    avec

    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
     
    void lecture_txt (Project_STRUCT * Projet )
    {    
        FILE *Out;    
        Out = fopen ("D:\toto.txt", "r");
     
        char firstline[4096];
        char unused1[128];
        char unused21[4096];
        char unused22[4096];
        char unused23[4096];
        char unused24[4096];
        int unused31=0;
        int unused32=0;
     
        if (Out != NULL)
        {
          fgets(firstline, sizeof firstline, Out);    
          fscanf(Out, "%s %s\n", unused1, unused21);
          Projet->Nom_projet = unused21;
     
          fgets(firstline, sizeof firstline, Out);     
          fscanf(Out, " %s %s\n ", unused1, unused22);         
          Projet->Chemin = unused22;
     
          fgets(firstline, sizeof firstline, Out);     
          fscanf(Out, " %s %s\n ", unused1, unused23);         
          Projet->DataFile = unused23;
     
          fgets(firstline, sizeof firstline, Out);     
          fscanf(Out, " %s %d\n ", unused1, &unused31);     
          Projet->TypeJeu = &unused31;    
     
          fgets(firstline, sizeof firstline, Out);     
          fscanf(Out, " %s %d\n ", unused1, &unused32);   
          Projet->UseFilterFile = &unused32;
     
    ....
     
          fclose (Out);
     
    }
    Le programme ci-dessus ne fonctionne pas car mes variables unused sont détruites en fin de fonction, et du coup, mes Projet->xxx pointent vers une adresse corrompue...

    Le problème c'est que le fscanf veut une variable du type tableau de char... Et moi je dois avoir dans mon Project_STRUCT un char *....

    Aussi, je ne vois pas comment faire....

    Le programme ci-dessus ne fonctionne pas car mes variables unusedxx sont détruites en fin de fonction, et du coup, mes Projet->xxx pointent vers une adresse corrompue...

    Alex

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le programme ci-dessus ne fonctionne pas car mes variables unused sont détruites en fin de fonction, et du coup, mes Projet->xxx pointent vers une adresse corrompue...

    Le problème c'est que le fscanf veut une variable du type tableau de char... Et moi je dois avoir dans mon Project_STRUCT un char *....
    Fais de l'allocation dynamique pour tes tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Projet->Nom_projet = malloc(strlen(unused21)+1);
    strcpy(Projet->Nom_projet, unused21);
    ....
    Du coup, tu n'as plus besoin de tous ces tableaux locaux, unused22[4096], unused23[4096] et unused24[4096];

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par diogene Voir le message
    Fais de l'allocation dynamique pour tes tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Projet->Nom_projet = malloc(strlen(unused21)+1);
    strcpy(Projet->Nom_projet, unused21);
    ....
    Ces 2 lignes ne correspondent-elles pas à strdup() ? Bien sûr, il faut penser à free() après chaque utilisation de strdup() ?

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    alexglvr :
    J'ai un autre petit problème...

    Si la chaine de caractère lue comporte des espaces genre
    "C:\DOCUMENTS AND SETTINGS\..."

    la lecture s'arrête au premier espace....
    Comme chaque ligne semble comporter plusieurs chaînes apparemment séparées par des blancs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                  fgets(firstline, sizeof firstline, Out);    
                  fscanf(Out, "%s %s\n", unused1, Projet->Nom_projet);
    comment fais-tu pour savoir si un blanc appartient à une chaine ou sépare une chaine de la suivante ?
    La réponse à ta question dépend de ça.

    salseropom :
    Ces 2 lignes ne correspondent-elles pas à strdup() ? Bien sûr, il faut penser à free() après chaque utilisation de strdup() ?
    Oui.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    L'idée c'était de couper la ligne en deux : le premier mot et le reste...

    Maintenant, je peux aussi utiliser un autre séparateur, type ":" ou ";"...

    Dans ce cas, comment définie t on ce caractère comme séparateur au lieu de "espace"?

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(Out, "%[^:]%*c%[^\n]s", unused1, Projet->Nom_projet);
    Ici j'ai défini le : tu peux mettre autre chose si tu le veux

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    j'ai modifié la fonction lecture_txt comme ceci:

    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
     
    void lecture_txt (Project_STRUCT * Projet )
    {    
        FILE *Out;    
        Out = fopen ("D:\toto.txt", "r");
     
        int size = 250;
     
        if (Out != NULL)
        {
                  Projet->Nom_projet = malloc(size);
                  fgets(firstline, sizeof firstline, Out);    
                  fscanf(Out, "%s %s\n", unused1, Projet->Nom_projet);
     
                  Projet->Chemin = malloc(size);
                  fgets(firstline, sizeof firstline, Out);     
                  fscanf(Out, " %s %s\n ", unused1,Projet->Chemin );         
     
                  Projet->DataFile = malloc(size);
                  fgets(firstline, sizeof firstline, Out);     
                  fscanf(Out, " %s %s\n ", unused1, Projet->DataFile);         
     
                  Projet->TypeJeu = malloc(sizeof(int));
                  fgets(firstline, sizeof firstline, Out);     
                  fscanf(Out, " %s %d\n ", unused1, Projet->TypeJeu);      
     
                  Projet->UseFilterFile = malloc(sizeof(int));
                  fgets(firstline, sizeof firstline, Out);     
                  fscanf(Out, " %s %d\n ", unused1, Projet->UseFilterFile);   
     
    ....
     
                  fclose (Out);
     
    }
    Ca a l'air de fonctionner...

    Y a t il une meilleur solution?

    Alex

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Y a t il une meilleur solution?
    Comme je l'ai suggéré dans mon post, au lieu d'allouer un taille fixe (250 dans ton cas) , tu peux allouer exactement la taille dont tu as besoin dans chaque cas. Ca peut avoir son importance si tu dois créer beaucoup de structures et/ou si la taille des chaines est très variable selon le cas.

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    merci pour ton aide !!!

    J'ai un autre petit problème...

    Si la chaine de caractère lue comporte des espaces genre
    "C:\DOCUMENTS AND SETTINGS\..."

    la lecture s'arrête au premier espace....

    Sais tu comment je pourrais résoudre ca STP?

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par diogene Voir le message
    Comme je l'ai suggéré dans mon post, au lieu d'allouer un taille fixe (250 dans ton cas) , tu peux allouer exactement la taille dont tu as besoin dans chaque cas. Ca peut avoir son importance si tu dois créer beaucoup de structures et/ou si la taille des chaines est très variable selon le cas.
    Comme je l'ai fait pour une fonction de ma bibliothèque C_Str, une allocation par progression :

    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
                while (fgets (buff, BUFFER_SIZE, p_file) != NULL)
                {
                   old_size = new_size;
                   new_size += strlen (buff);
                   err = C_Str_resize (self, new_size);
     
                   if (err == C_STR_NO_ERR)
                   {
                      memmove (&self->sz_string[old_size], buff, strlen (buff) + 1);
                   }
                   else
                   {
                      /* Erreur durant le chargement du fichier dans l'objet. */
                      C_Str_destroy (& self);
                      break;
                   }
                }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/02/2008, 07h30
  2. conversion char wide char
    Par ep31 dans le forum MFC
    Réponses: 4
    Dernier message: 15/11/2005, 08h14
  3. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  4. Pb Invalid Conversion "char" to "char*"
    Par kazarn dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2005, 13h24
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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