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 à deux dimensions de chaîne de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 8
    Par défaut Tableau à deux dimensions de chaîne de caractères
    Bonjour,

    J'aurais besoin de savoir comment réaliser un tableau à 2D de chaîne de caractère (avec à chaque case une chaîne de caractère dans un tableau, par exemple, en 5x5, sous forme de carré, de rectangles ou autre...), j'ai essayé avec cette structure mais cela ne semble pas très bien marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct abc
    {
    	char string[nbChar];
    };
    struct abc tab2D[x][y];
    Je m'explique, quand je mets des valeurs (string) à l'intérieur du tableau et que je tente de les réafficher par exemple tab2D[5][0] où j'ai affecté au préalable la valeur ab2, il me retourne la valeur ab1 alors que j'attends la valeur ab2.

    Aussi, au moment de où je tente d'afficher les infos, je peux utiliser, par exemple, soit tab2D[0][2].string, soit tab2D[0][2], les deux options me renvoyant des réponses différentes ce que je n'arrive pas très bien à comprendre.

    Je pense alors que ma façon de construire un tableau 2D à chaîne de caract n'est pas correcte mais je ne vois pas très bien comment faire autrement.

    Merci par avance !

  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
    Pourquoi passer par une structure ? Une chaine est un tableau de char. Tu as besoin d'un tableau 2D de chaines, autrement dit d'un tableau 3D de char. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab2D[x][y][nbChar];
    Chaque chaine est accessible via l'adresse tab2D[i][j] qui pointe le premier élément de la chaine (i,j)

    maintenant, je ne vois pas pourquoi ta méthode avec structure ne marche pas.

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Ici, tu compte faire un tableau bidirectionnel c'est-à-dire, avoir une ligne par chaîne de caractères donc, techniquement, tu peux à voir autant de ligne que de nombre de chaînes de caractères soit autant de colonne que le nombre maximum de caractère dans une chaîne (mise en gras les indices nécessaires) donc, en langage de programmation C, ta demande sera alors écrite comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* Préalablement */
    #define MAX 5
     
    /* Ensuite */
    char tChar[MAX][MAX];
     
    /* Ou tableau de pointeur */
    char *p_str[MAX] = { NULL };
    à bientôt

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* Préalablement */
    #define MAX 5
     
    /* Ensuite */
    char tChar[MAX][MAX];
     
    /* Ou tableau de pointeur */
    char *p_str[MAX] = { NULL };
    Bonjour

    Attention, il a dit "tableau2D de chaines" (en précisant "une chaine à chaque case"). Donc ce n'est pas un tableau 2D de char qu'il lui faut !!! (plus de détails dans le message de diogene à ce propos)
    Et attention aussi au tableau de pointeurs car chaque pointeur devra alors être alloué.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par Sve@r Voir le message
    Bonjour Attention, il a dit "tableau2D de chaines"
    Bien vue, je me suis foiré sur la 2D[chaine] ( d'où mon +1 au poste de diogene hier) et pour ce qui est des pointeurs bien sûr qu'il faut allouer.

    le code n'est pas super mais, elle peut écrire comme ceci
    Code C : 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
     
    /* Prog Gen test */
     
    /* libC */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define MAX	8
     
    /* type data */
    typedef struct s_data{
    	char *p_str;
    }ts_data[MAX][MAX];
     
     
    int main( void ){
     
    	ts_data data;
    	unsigned int i = 0;
    	unsigned int j = 0;
     
    	for( i = 0; i < MAX; i++ ){
    		for( j = 0; j < MAX; j++ ){
     
    			data[i][j].p_str = (char*)calloc( MAX, sizeof(char) );
    			if( data[i][j].p_str == NULL ){
    				perror("_ERREUR_ (ALLOCATION)\n");
    				exit( EXIT_FAILURE );
    			}else{
    				strcpy(data[i][j].p_str, "Bonjour" );
    			}
    		}
    	}
    	/* Affichage */
    	for( i = 0; i < MAX; i++ ){
    		for( j = 0; j < MAX; j++ ){
     
    			printf(" %4d|[%d][%d] => %s\n", i, i, j, data[i][j].p_str );
    		}
    		printf("\n");
    	}
     
    	return (EXIT_SUCCESS);
    }

    à bientôt

  6. #6
    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 code n'est pas super mais, elle peut écrire comme ceci ...
    C'est surtout qu'il est faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data[i][j].p_str = " Bonjour ";
    ne copie pas dans la chaine allouée par calloc() la chaine "bonjour", mais copie l'adresse de la chaine "bonjour" dans data[i][j].p_str ce qui détruira l'adresse du tableau obtenue par le calloc() et le rendra inaccessible.

  7. #7
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Voici un bel exemple à ne pas faire, effectivement j'écrase l'adresse fournie par la fonction d'allocation.
    Merci encore pour ta remarque.
    à bientôt

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/05/2006, 08h59
  2. Affichage d'un tableau à deux dimensions.
    Par Allan dans le forum C
    Réponses: 3
    Dernier message: 11/12/2005, 18h29
  3. Réponses: 1
    Dernier message: 18/11/2005, 11h38
  4. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38
  5. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50

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