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

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

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

  5. #5
    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?

  6. #6
    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 !

  7. #7
    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() ?

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

  9. #9
    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"?

  10. #10
    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

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 82
    Par défaut
    Quelque chose comme ça :
    Code :

    fscanf(Out, "%[^:]%*c%[^\n]s", unused1, Projet->Nom_projet);
    Ça marche super si je lis une chaine de caractère comme deuxième paramétre...

    Par contre, je n'arrive pas à lire un entier....

    j'ai aussi essayé
    fscanf(Out, "%[^;]%*c%[^\n]d", unused1, Proj_main->Projet->TypeJeu);

    sans succès!!!

  12. #12
    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
    Il y a une légère erreur dans le format proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(Out, "%[^:]%*c%[^\n]",....
    Le s terminal a pu te faire croire que c'est lui qui spécifiait une chaine.
    En fait, %[] spécifie une chaine et ne peut pas être utilisé pour charger un entier.
    Toutefois, tu peux lire la chaine et la convertir ensuite en entier (ou utiliser un format pour entier comme %d)

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