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 chaine de caractere 10 lignes 2 colonnes


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut tableau chaine de caractere 10 lignes 2 colonnes
    Bonjour tout le monde

    Alors voilà, je débute dans la programmation C. J'ai saisi le principe des pointeurs , par contre ce que je n'arrive pas à coder est la chose suivante :

    je souhaite un tableau de 10 lignes et de 2 colonnes. Le contenu est une chaine de caractère.
    Pour résumer, je voudrais avoir un truc du style : tab[2,0]="coucou";

    Merci d'avance

    windows 10 / DEBIAN 7.9 / Etc...

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu trouveras la syntaxe adéquate dans l'un des cours de C en deux clics et quelques crans de molette.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Pour information, [] est un opérateur acceptant deux opérandes: une valeur à gauche du crochet ouvrant, et une entre les deux.
    Si tu comprends les pointeurs, la valeur retourné par a[b] est la valeur désigné par *(a+b). Par une curiosité syntaxique, il s'avère que a[b] et b[a] sont la même valeur.

    N'hésite surtout pas à regarder la partie C de cppreference.com, notamment la page sur les opérateurs, ou celle sur les tableaux (dans language)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut
    Merci de vos réponses
    Mais il y a une chose qui me chagrine :
    Pour l'écriture [a][b], c'est une erreur de ma part. Je code habituellement en pascal.
    Donc si je déclare mon tableau comme ça :
    Char montbl [2][3], et que je veuille mettre "chaine de caractères" a l'emplacement [1][2],
    esc ce que montbl [1][2]="chaine de caractères"; est valable ?

    A+

    windows 10 / DEBIAN 7.9 / Etc...

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Non, pour deux raisons qui sont également déductibles de n'importe quel cours C pour débutant :

    • on ne peut pas stocker une chaîne de caractères dans un char ;
    • l'affectation de chaînes de caractères n'est pas possible via l'opérateur = en C.


    Relis le cours, apprends le langage. Si tu connais le Pascal, tu n'éprouveras pas de difficulté à t'adapter.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    char est le type d'un caractère isolé. 'a' est une valeur de ce type. (De même que (char)8, mais c'est une autre histoire)

    "coin coin" est un litéral (= une valeur) de chaine de caractères, pas un caractère isolé. Note la présence de double guillemets (double quotes).

    le type d'une chaine de caractères est plus ou moins tableau de caractères, avec une taille fixe.
    Il est possible d'initialiser un char[] avec une chaine litérale. Mais pas de l'affecter après coup.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char chaine[] = "coin coin"; //valide
    chaine = "bidule"; // invalide
    Pour lire plus facilement un type complexe comme char tab[2][10], il est possible de le lire "à l'envers"
    char tab[10][2] peut se lire "soit char le type de chacun des 10 élements de chacun des 2 éléments de tab".
    Ainsi, tab[1][8] est un char, et je peux lui affecter 'a'.
    tab[8] dispose de deux éléments, chacun étant un char.

    Une initialisation de tab est possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab[2][10] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
    .

    Tu noteras que [c]"a"[/c} est une chaine représenté par une séquence de deux caractères, 'a' et '/0', le caractère nul marquant sa fin.

    Pour avoir une table de 2 * 10 chaines de caractères de tailles variables, il faut que la variable soit telle qu'en appliquant deux fois l'opérateur d'indexation ([]), la valeur obtenue soit un pointeur de caractère:
    remarque: dans une déclaration, le pointeur (* s'applique après l'indexeur ([...]).

    Si au contraire, les chaines sont de taille fixe, il faut préciser cette taille (max) comme index supplémentaire (en tenant compte du caractère null:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char tab[taille_mot+1][2][10];
    Dans les deux cas, si les chaines ne doivent pas être modifiables, tu peux utiliser le mot clé const
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * tab[2][10];
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Bonjour,

    Citation Envoyé par CharleLéo Voir le message
    Mais il y a une chose qui me chagrine :
    […] si je déclare mon tableau comme ça :
    Char montbl [2][3], et que je veuille mettre "chaine de caractères" a l'emplacement [1][2],
    esc ce que montbl [1][2]="chaine de caractères"; est valable ?
    Il faut simplement se souvenir que « chaîne de caractères » n'est pas en soi un type natif du C, comme il peut l'être dans d'autres langages de plus haut niveau. Le C est fait pour manipuler des éléments de taille fixe ou, à la limite, déterminable à l'avance.

    Quand on manipule des chaînes de caractères en C, on passe pour ainsi dire toujours par « char * » (avec le qualificateur « const » ou pas), c'est-à-dire un « pointeur sur un caractère ». Le caractère pointé est censé être le premier de la chaîne et c'est uniquement en incrémentant l'index qu'on lit les suivants. C'est par ailleurs le fait d'avoir une sentinelle à la fin de la chaîne matérialisée par le caractère nul ('\0') qui permet de savoir qu'on a atteint la fin. Ça pose d'ailleurs des problèmes quand on l'oublie ou qu'on l'écrase.

    C'est aussi pour cette raison qu'il n'existe pas d'opérateur dédié à leur manipulation. Comme elles peuvent être potentiellement très longues et qu'elles impliquent des procédures algorithmiques (au moins des boucles) pour être manipulées, on passe par des fonctions explicites comme strcpy() ou strcmp(). Et on alloue leur mémoire à la main…

    Ce qui nous amène à constater qu'un « tableau de caractères » est, en soi, équivalent à une « chaîne de caractères » : une suite ordonnée de caractères consécutifs en mémoire et de même format. Tant et si bien que c'est une manière propre de déclarer une chaîne qui peut être modifiée par la suite et de réserver la mémoire qui lui correspond. Lorsque tu écris :
    …tu déclares « un tableau (ou une chaîne) de huit caractères », mais pas « un tableau de huit chaînes de caractères ».

    Si c'est pourtant là ce que tu veux faire, soit tu passes normalement par des pointeurs :

    … auquel cas tu déclares « un tableau de huit pointeurs vers un caractère (ou le premier caractère d'une chaîne) », à charge à toi (ou au compilo) de placer ensuite lesdites chaînes en mémoire et de les référencer proprement, soit tu passes effectivement par un tableau multi-dimensionnel :

    … ce qui te permet de réserver « trois fois huit caractères consécutivement en mémoire ». La dimension la moins significative (la plus à droite) représente donc la taille de tes chaînes, qui est donc forcément fixe (huit caractères dans cet exemple).



    Enfin, un mot sur les guillemets. Placer un texte entre guillemets permet de spécifier une chaîne de caractères au compilateur, qui lui va la gérer comme il faut en fonction du contexte. D'abord, il va systématiquement ajouter la sentinelle '\0' au texte (si bien que "hello" fera six caractères et non cinq, il faudra en tenir compte si tu dimensionnes un tableau avec). Puis :
    • Si tu l'affectes à un tableau, alors le contenu du tableau sera initialisé avec le texte en question ;
    • Sinon, la chaîne sera placée en mémoire en lecture seule, avec le reste de l'image compilée, et l'expression entière sera assimilée à un « char * » qui pointera cet endroit. À toi donc d'affecter cette valeur à un pointeur dûment déclaré ou à n'importe quoi d'autre qui fasse l'affaire par le biais d'un transtypage.


    Dans le cas du tableau, la taille déclarée fait foi. Sinon, le C la détermine automatiquement en fonction du littéral chaîne entre guillemets ou de l'ensemble passé en accolade :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        char tab[3]  = "Hello";     // Contiendra 'h', 'e', 'l' uniquement, sans terminateur ;
        char tab[6]  = "Hello";     // Contiendra 'h', 'e', 'l', 'l', 'o', '\0' exactement ;
        char tab[10] = "Hello";     // Contiendra 'h', 'e', 'l', 'l', 'o', '\0' puis 0, 0, 0, 0 car les éléments restants seront initialisés comme des variables statiques (alinéas 14 et 21 de la section 6.7.8 de C99)
        char tab[]   = "Hello";     // Sera équivalent à tab[6].

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut
    merci de vos réponse.

    Si j'ai bien compris, pour avoir un tableau de deux colonnes et de 5 lignes contenant une chaine de caractère la déclaration sera :

    char * tableau[5][2];

    windows 10 / DEBIAN 7.9 / Etc...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2004
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 251
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Tu trouveras la syntaxe adéquate dans l'un des cours de C en deux clics et quelques crans de molette.
    merci, c'est sympa ta réponse.

    windows 10 / DEBIAN 7.9 / Etc...

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par CharleLéo Voir le message
    merci de vos réponse.

    Si j'ai bien compris, pour avoir un tableau de deux colonnes et de 5 lignes contenant une chaine de caractère la déclaration sera :

    char * tableau[5][2];
    Oui, si c'est bien dans le sens où on l'entend, c'est-à-dire « deux colonnes et cinq lignes », soit « 10 chaînes de caractères en tout », sachant que ton tableau référencera ces dix chaînes à l'aide de pointeurs, mais en aucun cas ne les contiendra lui-même. Si ces chaînes de caractères sont « constantes » (donc en lecture seule), pas de problème, tu peux laisser le compilateur gérer tout cela. Si tu veux pouvoir « changer la chaîne référencée par une cellule donnée », pas de problème non plus, il suffit de modifier la valeur du pointeur. Mais si par contre tu veux pouvoir « modifier le contenu des chaînes », par exemple en la faisant saisir par l'utilisateur avec fgets() ou scanf(), alors il te faudra allouer de la mémoire quelque part pour que cela puisse se faire.

    Si tu veux qu'elles soient directement stockées dans le tableau, il faudra ajouter une dimension supplémentaire de taille égale à celle de tes chaînes.

  11. #11
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Citation Envoyé par CharleLéo Voir le message
    Citation Envoyé par Matt_Houston Voir le message
    Tu trouveras la syntaxe adéquate dans l'un des cours de C en deux clics et quelques crans de molette.
    merci, c'est sympa ta réponse.
    Oui, c'est même très sympa, car il est primordial de bien comprendre les utilisations de tableau de tableaux. Tu as depuis obtenu une réponse détaillée, pense à bien les relire (car ton résumé oubli une chose) .

Discussions similaires

  1. Tableau - détails sur lignes et colonnes
    Par BiM dans le forum BIRT
    Réponses: 2
    Dernier message: 05/07/2006, 12h51
  2. [Tableaux] tableau de chaine de caractere
    Par Tempotpo dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2006, 14h54
  3. Supprimer toutes les lignes et colonnes d'un tableau
    Par pekka77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 12h26
  4. Tableau 5 lignes * 3 colonnes
    Par slackjayo dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 05/04/2005, 12h27
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 12h33

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