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 :

Tableau de chaînes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    641
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut Tableau de chaînes
    Bonjour,

    Je cherche à remplir un tableau de chaîne à partir des lignes d'un fichier.
    J'ai le code suivant :

    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
    char *OKLines = NULL;
    int OKLinesCount = 0;
     
    while (fgets(line, LINE_SIZE, fp) != NULL) {
    	addLine(line, &OKLines, OKLinesCount);
    	OKLinesCount ++;
    }
     
    void addLine(char *line, char **lines, int count) {
    	*lines = (char*)realloc (*lines, (count + 1) * sizeof (line));
    	if (NULL == lines) {
    		printf("Mémoire insuffisante.\n");
    		free (lines);
    		exit (EXIT_FAILURE);
    	}
    	strcpy((*lines + count), line);
    }
    Cela provoque un coredump. Je pense que sizeof (line) ne fonctionne pas.
    Quelle serait la bonne syntaxe ?

  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
    Tu cherches à construire par allocation dynamique un tableau de chaines, chaque chaine étant allouée de façon dynamique. Chaque chaine correspondra à un pointeur char*. Le tableau de chaines correspondra donc à un pointeur char**. On aura donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char ** OKLines = NULL; // le tableau est vide
    int OKLinesCount = 0;   // ...
    while (fgets(line, LINE_SIZE, fp) != NULL) {
    	addLine(line, &OKLines, OKLinesCount); // Comment savoir que l'insertion a reussi ?
    	OKLinesCount ++;
    }
    Pour savoir si l'insertion a réussi, il faut que la fonction renvoie un indicateur. Par exemple :
    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
    void * addLine(char *line, char ***lines, int count)
    {
       char ** tab = NULL;
       // Allouer de la place pour la nouvelle chaine :
       char * chaine = malloc(strlen(line)+1);
       if(chaine != NULL) {
          // Allouer un élément de plus au tableau : 
          tab = realloc(*lines, (count+1)* sizeof *tab);
          if(tab != NULL){
             *lines = tab ;
              // Copier la chaine et son pointeur : 
              strcpy(chaine,line);
              tab[count] = chaine;
          }
          else free(chaine), chaine = NULL; // échec de la réallocation
       } 
       return chaine;
    }
    La fonction retourne NULL en cas d'échec d'allocation et le tableau de chaines et les chaines sont alors inchangés.
    La séquence d'appel devient par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char ** OKLines = NULL; // le tableau est vide
    int OKLinesCount = 0;   // ...
    while (fgets(line, LINE_SIZE, fp) != NULL) {
       if(addLine(line, &OKLines, OKLinesCount)!= NULL) OKLinesCount ++;
       else {
          printf("Mémoire insuffisante.\n");
          break;
       }
    }

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    641
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut
    Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/03/2007, 12h09
  2. Réponses: 3
    Dernier message: 01/03/2007, 16h26
  3. Tableau de chaînes de caractères
    Par sone47 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2007, 14h54
  4. tableau de chaîne de caractères
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 17h23
  5. Tableau de chaînes de caractères
    Par mac1 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2006, 13h18

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