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 :

Comment insérer des pointeurs vers caractère dans un tableau ?


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Comment insérer des pointeurs vers caractère dans un tableau ?
    Bonjour, ou peut être bonsoir ! J'aimerais savoir comment faire pour insérer des pointeurs de caractère dans un tableau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *unit[] = {"un",  "deux", "trois", "quatre", "cinq",
                    "six", "sept", "huit",  "neuf"};
    char *numbers[] = {"onze", "douze", "treize", "quatorze", "quinze", "seize"};
    char *multiples_of_ten[] = {"dix",      "vingt",     "trente",
                                "quarante", "cinquante", "soixante",
                                "septante", "huitante",  "nonante"};
    char *powers_of_ten[] = {"cent",    "mille",    "million", "milliard",
                             "billion", "billiard", "trillion"};
    Si je fais un malloc() ou un calloc() pour alloué un tableau dynamique ou même un tableau comme cela : static char array[800]; Comment puis-je faire pour mettre unit[0] dans ce tableau par exemple ? Ou en mettre plusieurs dans une boucle for() ? J'aimerais savoir la différence entre un calloc(length, sizeof(char)) et un static char array[length]. Es ce que un tableau avec une taille fixe peut être vu comme un pointeur ? Merci d'avance pour toute aides !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Vite fait

    Citation Envoyé par Modaak Voir le message
    static char array[800]; Comment puis-je faire pour mettre unit[0] dans ce tableau par exemple ?
    Tu ne peux pas unit[0] étant 1 chaîne de caractères (en C, c'est 1 tableau de caractères terminé par le caractère sentinelle '\0'), tu ne peux pas la stocker dans 1 seul caractère.

    Il faut static char* array[800] ou static char array[800][XXX] (<- XXX étant la taille de tes chaînes de caractères)

    Sinon tu as strcpy ou memcpy pour faire des copies (<- 2 liens cplusplus.com en anglais)

    Citation Envoyé par Modaak Voir le message
    la différence entre un calloc(length, sizeof(char)) et un static char array[length]
    Avec 1 tableau fixe (static ou pas) tu peux modifier le contenu, mais tu ne peux pas modifier la taille/ structure (rajouter et/ ou supprimer des éléments)

    Citation Envoyé par Modaak Voir le message
    Es ce que un tableau avec une taille fixe peut être vu comme un pointeur ?
    Lorsque tu dis XXX array[15], l'identifiant array est le pointeur sur la première case.
    Donc, pour avoir l'accès à l'élément X, tu peux coder array[X] ou *(array + X).
    De toute manière, les tableaux en C sont dégradés en pointeur - c'est pour cela que tu dois toujours associer la taille à 1 tableau

    Et tu dois te le demander, et je le sais que tu te le demandes, quelle est donc la différence entre 1 pointeur et 1 tableau ?
    Tu ne peux pas définir 1 tableau avec 1 type incomplet, contrairement à 1 pointeur. Parce qu'en en gros, 1 pointeur étant 1 adresse, lors de la définition le type n'est pas important : 1 pointeur sera toujours 4 octets en 32bits et 8 octets en 64bits.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Modaak Voir le message
    J'aimerais savoir comment faire pour insérer des pointeurs de caractère dans un tableau ?
    Travaille par analogie: si tu veux insérer des int dans un tableau, il te faut un tableau d'int. Si tu veux insérer des pointeurs de caractères dans un tableau, il te faut alors un tableau de pointeurs de caractères.

    Citation Envoyé par Modaak Voir le message
    Si je fais un malloc() ou un calloc() pour alloué un tableau dynamique ou même un tableau comme cela : static char array[800]; Comment puis-je faire pour mettre unit[0] dans ce tableau par exemple ?
    On peut se demander pourquoi tu veux faire cela étant donné que "unit" est déjà un tableau de pointeurs de caractères. Donc ayant déjà un tableau contenant ce que tu veux, il est bizarre de vouloir créer un second tableau ayant exactement la même chose mais admettons. Toutefois, tout comme on ne peut pas copier un float dans un tableau d'int, on ne peut pas copier un char étoile dans un tableau de char. Le type "char étoile" ce n'est pas le type "char" (et tu remarqueras que si j'ai pris la peine d'écrire "étoile" c'est parce que justement ça change tout).
    Il te faut définir "array" de cette façon: static char* array[800] (tableau de 800 char*, avec l'espace avant ou après l'étoile comme tu préfères) puis tu peux ensuite copier unit[0] (un char*) dans array[0] (là aussi un char*) de façon classique: array[0]=unit[0].

    Citation Envoyé par Modaak Voir le message
    Ou en mettre plusieurs dans une boucle for() ?
    Si tu tiens tellement à transférer tes pièces de la poche gauche à la poche droite avant de payer ton pain... for (i=0, i < 9; i++) array[i]=unit[i].

    Citation Envoyé par Modaak Voir le message
    J'aimerais savoir la différence entre un calloc(length, sizeof(char)) et un static char array[length]
    Outre le fait qu'une allocation dynamique ne se justifie absolument pas quand la taille est connue à l'avance, un tableau statique est unique pour tout ton programme. Si tu le remplis 2 fois, le second remplissage écrase les valeurs du premier. Alors qu'on peut allouer plein de zones différentes.

    Citation Envoyé par Modaak Voir le message
    Es ce que un tableau avec une taille fixe peut être vu comme un pointeur ?
    Oui, c'est d'ailleurs la base du transfert d'un tableau vers une fonction => on n'y transfère que l'adresse du premier item et la fonction ayant cette adresse, peut alors
    • accéder à l'item qu'elle contient
    • user de la garantie que tous les items se suivent pour accéder alors aux items suivants et obtenir ainsi tout le tableau


    C'est aussi la base qui permet l'arithmétique des pointeurs (si un pointeur est placé sur un item précis d'un tableau, quelle que soit la taille de cet item, incrémenter le pointeur de 1 fera passer à l'item suivant).
    La même boucle que tout à l'heure mais en utilisant cette fois des pointeurs et leur arithmétique
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *ptA;
    char *ptU;
    size_t i;
     
    for (i=0, ptA=array, ptU=unit; i < 9; i++, ptA++, ptU++) (*ptA)=(*ptU);
    C'est plus rapide car l'opération tab[x] implique un calcul (je me positionne sur tab puis je décale de x éléments) qui est fait 2 fois (array[i]=unit[i]) tandis que "ptA" et "ptU" étant déjà placés à la bonne case de leurs tableaux respectifs, il n'y a aucun calcul de positionnement (enfin ici certains intervenants soutiennent que le compilateur peut détecter ce type d'instruction et le remplacer alors de lui-même par un pointeur mais perso, même si c'est vrai, je me dis que si on le fait soi-même au-moins on est certain que c'est fait plutôt que de compter sur une hypothétique optimisation automatique).

    Et en plus condensé... for (i=0, ptA=array, ptU=unit; i < 9; i++, (*ptA++)=(*ptU++)); (gos effet de "jmelapete" qui obscurcit ton code sans rien changer à sa vitesse d'exécution).
    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]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    super merci pour tout ces conseils ! et j'ai une dernière petite question si je veux concaténer les deux chaines de caractère unit[1] + power_of_ten[3] et le mettre dans un pointeur du type char *array; ou char array[length]; je fais comment pour ne pas prendre le '\0' des deux pointeurs, car si j'utilise strncat() ou strcat cela va prendre le '\0' ? Merci d'avance !

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Modaak Voir le message
    je fais comment pour ne pas prendre le '\0' des deux pointeurs, car si j'utilise strncat() ou strcat cela va prendre le '\0' ? Merci d'avance !
    D'après la documentation en anglais de strncat sur cplusplus.com, la concaténation ajoute le caractère sentinelle '\0'.
    Ce sont surtout avec les fonctions strncpy et petites sœurs, surtout d'1 plateforme/ système d'exploitation à 1 autre qu'il faut se méfier

    Mais pourquoi vouloir garder le caractère sentinelle '\0' de la chaîne la + à gauche ?
    Il faut alors coder ses fonctions pour voir la chaîne concaténée la + à droite

    Sinon, tu peux faire 1 truc style sprintf(result, "%s\0%s\0", str1, str2);, la documentation en anglais de sprintf sur cplusplus.com.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Modaak Voir le message
    je fais comment pour ne pas prendre le '\0' des deux pointeurs, car si j'utilise strncat() ou strcat cela va prendre le '\0' ?
    Les fonctions qui manipulent les str gèrent elles-même le '\0'. Si tu garantis que ce qu'elles auront à manipuler sont des strings valides (des tableaux de caractères contenant impérativement un '\0') elles te garantissent en retour un traitement parfait. Toute fonction qui doit créer une string mettra elle-même le '\0' là où il faut. Seule exception, la fonction strncpy() qui s'arrête à "n" caractères ne mettra pas le '\0' si n est atteint (et avant de lire le post de foetus, je pensais que strncat() faisait pareil).
    Exemple1: strncpy(dest, "toto", 5) => il y a moins de 5 caractères à copier, la fonction s'arrête donc à la fin de la string "toto" quand elle trouve le '\0' qui termine la string, ce '\0' est mis dans "dest"
    Exemple2: strncpy(dest, "toto", 3) => il y a plus de 3 caractères à copier, la fonction s'arrête alors à 3 caractères et n'a pas trouvé de '\0', le '\0' n'est alors pas mis dans "dest"
    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]

  7. #7
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par Modaak Voir le message
    J'aimerais savoir comment faire pour insérer des pointeurs de caractère dans un Comment puis-je faire pour mettre unit[0] dans ce tableau par exemple ? Ou en mettre plusieurs dans une boucle for() ?
    Salut,
    Ton objectif est de construire une expression ("phrase") à partir d'une liste de mots.
    Un tableau alloué à la compilation et strcat (avec précautions) (éventuellement strcat_s) suffisent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const char* const word[]= {"Hello ", "World", "!"};
    char buff[80]; //= {0}; 
    buff[0]= 0; //reset buffer
    for (size_t i=0; i<3; ++i)
         strcat(buff, word[i]);
     
    puts(buff);

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2020
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Oui c'est ça je veux construire une chaine de caractère du genre "soixante-et-un-mille-soixante-et-un" en prenant les valeurs dans les tableaux que j'ai définis précédemment. je vous explique en gros ce que fait mon programme quand on renseigne dans le terminal la commande "./spell-number fr_FR 721112"
    le programme va décomposer le nombre en {7, 100, 20, 1, 1000, 100, 12} puis va parcourir le tableau avec une boucle for(), et suivant les valeur il va mettre dans un autre tableau l'équivalent du chiffre en lettre "sept-cent-vingt-et-un-mille-cent-douze"

    pour les chiffre de 1 à 9 j' utilise ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unit[current_value - 1]);
    pour trouver son equivalent en lettre current_value c'est l'index courrant du tableau.
    pour les chiffre de 11 à 16 j'utilise ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numbers[current_value - 11]);
    pour les multiple de 10 j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    multiples_of_ten[(current_value / 10) - 1]);
    et après pour les puissance de 10 je fais du cas par cas !

    comment auriez-vous fait vous ? pour résoudre ce problème !

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Modaak Voir le message
    le programme va décomposer le nombre 721112 en {7, 100, 20, 1, 1000, 100, 12}
    Donc le couple (7, 100) se voit comme 7 * 100 (multiplication); le couple (20, 1) comme 20 + 1 (addition), le nombre "1000" est un séparateur milliers (pas un vrai nombre donc), le nombre 12 lui n'est pas décomposé en couple quelconque mais le couple (100, 12) est lui une addition. Effectivement un algo pareil ça ne va pas être évident ...

    Citation Envoyé par Modaak Voir le message
    comment auriez-vous fait vous ? pour résoudre ce problème !
    https://www.developpez.net/forums/d2...ion-structures
    https://www.developpez.net/forums/d2...ine-caracteres
    https://www.developpez.net/forums/d2...actere-tableau
    3 topics différents pour toujours poser la même question (que tu semblais à priori savoir faire en Python !!!)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char *spell(unsigned short n) {
    	switch (n) {
    		case 0: return NULL;
    		case 1: return "un";
    		case 2: return "deux";
    		case 3: return "trois";
    		...
    		case 99: return "quatre-vingt dix-neuf";
    	}
    }
    Après tu décomposes ton nombre en groupe de 3 et tu passes chaque groupe à la fonction en gérant les centaines puis tu rajoutes "milliard", "million", "mille"...
    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]

  10. #10
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par Modaak Voir le message
    comment auriez-vous fait vous ? pour résoudre ce problème !
    Lequel ? Celui des puissances ?

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

Discussions similaires

  1. [WD-2013] Comment insérer bordure pour une image dans un tableau
    Par boboss123 dans le forum Word
    Réponses: 6
    Dernier message: 30/07/2014, 09h16
  2. Mettre des chaines de caractères dans un tableau.
    Par dinaing dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 18/06/2010, 12h09
  3. Réponses: 2
    Dernier message: 06/05/2008, 10h52
  4. [16F876] Ecrire des chaînes de caractères dans un tableau
    Par aminousse dans le forum Autres architectures
    Réponses: 0
    Dernier message: 01/03/2008, 01h08
  5. [MySQL] Comment insérer des données contenant un "\" dans
    Par ALEX77 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/09/2005, 16h04

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