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 :

Copie d'un tableau de caractères dans un autre, tous les 2 indices


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut Copie d'un tableau de caractères dans un autre, tous les 2 indices
    Bonjour à tous,

    Je souhaiterais copier un tableau de caractères dans un autre tableau tous les 2 indices. Je m'explique: dans la plupart des cas, on souhaite copier un tableau dans un autre case pour case.
    Exemple: on va appeler le premier tableau Depart et le second Copie. Depart = {'a','z','e','r','t','y'). On obtient alors pour le second tableau: Copie= {'a','z','e','r','t','y')
    Cependant, ce n'est pas ce que je veux faire ici. Un exemple permet de bien illustrer : Depart contient toujours la même chaine. Je souhaiterais que chaque case du second tableau contienne deux cases du premier.
    On obtient alors ceci: Copie={"az","er","ty"}.
    J'espère avoir été clair dans mes explications.
    J'ai déjà réussi à faire une copie toute simple comme évoqué au début mais étant débutant en langage c, je ne sais pas comment faire pour avoir une copie tous les 2 indices.

    Je remercie toute personne qui pourrait m'éclairer.

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Comme on a pas vraiment de contexte, on va prendre ton exemple.
    Donc on part d'un tableau de six char que tu vas copier dans un tableau de 3 tableaux de 2 char.
    Je te donne la déclaration du tableau :
    Essais de faire la copie de ton tableau depart dans ce tableau et montre nous, nous t'aiderons si tu n'y arrive pas.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci beaucoup pour votre aide. J'ai cependant une question. J'ai appris que chaque chaine de caractère se termine par un caractère de fin de chaine qu'il faut prendre en compte lors de la déclaration. Du coup, moi j'aurais mis Depart [7] et Copie [3] [3]. Faut-il prendre en compte ce caractère de fin de chaine ?

  4. #4
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Tu parlais de tableaux de caractères pas de chaînes de caractères. Ce n'est pas tout à fait la même chose. Les deux existe. D'ailleurs dans la présentation que tu en a fait, Depart = {'a','z','e','r','t','y') tu n'as pas mis de caractère de fin de chaîne.
    Alors il faut choisir ! Soit ce que je t'ai dit soit si tu pars sur les chaînes de caractères Ton depart sera une chaine de caractère et ta copie sera un tableau de trois chaînes de caractère (Chaque chaînes aura 2 caractères plus le caractère de fin de chaîne soit 3 caractère ce qui fait bien Copie [3] [3].

    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Hello,

    Tu as écrit ta demande en travaillant sur des char, pas sur des chaines de caractères (tableau de caractères qui se termine par un \0). Donc la déclaration donnée par @CGi est correcte. La tienne également si tu travailles sur des chaines de caractères.

    La différence (simple exemple pour un affichage) entre tableau de caractères et chaine de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char caract[3]={'1','2','3'};		// tabeau de caractères
    char str[4]={"123"};			// chaine de caractères
     
    for(int i=0; i<3; i++)
    	putchar(caract[i]);
    putchar('\n');
     
    printf("%s\n",str);

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Oui excusez-moi, je voulais dire chaine de caractère et pas tableau de caractère et j'ai oublié le caractère de fin de chaine pour le tableau Depart.
    Je reviens sur ce que j'ai dit au sujet de mes déclarations: en fait j'aurais mis Depart [9] et Copie [3] [3]. Je crois que le compilateur considère un tableau 2D comme un tableau de tableau 1D. Donc ces déclarations permettraient d'avoir les mêmes dimensions car 3*3=9. Mais d'après edgarjacobs (et je suis certain que vous avez raison), mais déclarations précédentes étaient correctes alors que les tableaux n'avaient pas les mêmes dimensions. Je ne comprends pas très bien.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Mes déclarations et pas mais déclarations. Excusez-moi pour la grosse faute d'orthographe.

  8. #8
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    C'est très simple: dans le tableau de départ, tu n'as qu'un seul '\0', dans le tableau d'arrivée, tu en as trois, soit deux de plus. 7+2=9

    Et pas besoin de faire un nouveau post pour corriger le précédent, il suffit de cliquer sur "modifier le message"

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci, donc ça veut dire que Depart [9] et Copie [3] [3] sont des déclarations correctes si j'ai bien compris. Si tel est bien le cas, je ne comprends pas pourquoi c'était bon aussi quand j'ai mis Depart [7] et Copie [3] [3].

  10. #10
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 753
    Par défaut
    Décomposons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    depart[7]={'a','z','e','r','t','y','\0'};
    et après la modification que tu envisages de faire,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    arrivee[3][3] vaudra {
        {'a','z','\0'},
        {'e','r','\0'},
        {'t','y','\0'}
    };
    Ne pas oublier que depart et arrivee sont deux entités entièremenet séparées, qui ont des adresses mémoire différentes. Dans la modificationn que tu envisages, tu déplaces des caractères de l'une à l'autre, tu ne déplaces pas des caratères au sein d'une même entité. Donc à partir du moment où chaque entité a la place pour contenir (au moins) ce qu'on va lui donner, tout va bien.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Voici ce que j'ai fait mais comme vous pouvez le voir, ça n'a pas très bien fonctionné. J'ai mis dans le fichier le résultat de la compilation et de l'exécution.
    v.c

  12. #12
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    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 747
    Par défaut
    J'arrive après la guerre

    Les chaînes de caractères n'existent pas en C : ce sont des tableaux de caractères (char) … et donc seulement ASCII
    documentation de string.h (C)/ <cstring> (C++)
    c'est la librairie standard qui impose de manière implicite : 1 chaîne de caractère en C, c'est 1 tableau terminé par le caractère sentinelle '\0'.

    Après comme le char fait 1 octet (seul type C ayant 1 taille fixe il me semble), il est compatible MBCS/ ANSI et UTF-8 … mais il faut avoir 1 bibliothèque spécifique.

    Si tu fais 1 petit programme comme celui-ci:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        char str1[] = "bonjour";
        char* str2  = "bonjour";
        char str3[] = {'b','o','n','j','o','u','r', '\0'};
        char str4[] = {'b','o','n','j','o','u','r'};
     
        printf("%s (%lu)\n%s (%lu)\n%s (%lu)\n%s (%lu)\n", str1, (sizeof(str1)/ sizeof( str1[0] )),
                                                           str2, (sizeof(str2)/ sizeof( str2[0] )),
                                                           str3, (sizeof(str3)/ sizeof( str3[0] )),
                                                           str4, (sizeof(str4)/ sizeof( str4[0] )));
     
     
        return EXIT_SUCCESS;
    }
    Résultat:
    bonjour (8)
    bonjour (8) // édit: @CGi me dit justement que c'est 1 coup de chance parce que sizeof(str2) fera toujours 8 parce que c'est 1 pointeur (sur 64bits, 8 octets)
    bonjour (8)
    bonjourbonjour (7)
    tu vois que le compilateur insère automatiquement le caractère sentinelle '\0'.
    Par contre, pour le tableau défini caractère par caractère, il ne le fait pas : est-ce dépendant du compilateur ? Le compilateur se dit sûrement que comme tu le fais à la main, il te laisse faire.

    Le calcul de la taille sizeof(pointeur)/ sizeof(premier élément) ne marche que dans le même fichier il me semble (histoire de dégradation des tableaux en pointeur)
    Et il y a 1 différence entre str1 et str2 : (à vérifier et sûrement dépendant des compilateurs): str1 est 1 tableau constant (tu ne peux pas modifier sa taille) et str2 est 1 pointeur constant (tu ne peux pas changer la chaîne (en recréant 1 pointeur) … et chaîne qui semble constante)

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci, je pense que j'ai compris cet histoire de caractère de fin de chaine rajouté automatiquement.
    Concernant ma fonction, je ne sais pas quoi modifier pour ne plus avoir de warning et avoir la copie attendue.
    Quelqu'un pourrait-il m'aider s'il vous plaît ?

  14. #14
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Poste ton code à l'aide de la balise code # (J'ai failli pas le voir).
    - Tu ne peux pas afficher copie avec un printf, copie contient 3 chaines, tu dois les afficher une à une.
    - Pour l'instant fait l'exercice en initialisant la chaîne de départ dans le code, donc pas de scanf.
    - Chaine de départ de taille 7 char : les 6 caractères + le caractère de fin de chaîne.



    @foetus attention à ton (sizeof(str2)/ sizeof( str2[0]) , c'est un coup de bol qu'il fasse 8. (taille d'un pointeur (8 en 64 bits) / 1 (taille d'un char) )
    Pour le dernier str4, c'est un tableau de char, pas une chaîne de caractère, il n'a pas de caractère de fin de chaîne. Ça ne dépend pas du compilateur, C'est défini dans la norme.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Voilà mon code. Cette fois-ci j'obtiens une erreur.
    code # v.c

  16. #16
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Bon, je te mets une solution, mais tu devrais reprendre des exercices plus simples.
    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
    #include <stdio.h>
     
    void fonction (char Depart[], char Copie[][3]);
     
    int main()
    {
        char Depart[7]="azerty";
        char Copie[3][3];
     
        fonction(Depart, Copie);
     
        for (int i=0; i<3; i++)
        {
            printf("%s\n", Copie[i]);
        }
     
        return 0;
    }
     
     
    void fonction (char Depart[],char Copie[][3])
    {
        for (int i=0; i<3; i++)
        {
            for (int j=0; j<2; j++)
            {
                Copie[i][j]= Depart[i*2 + j];
            }
            Copie[i][2]='\0';
        }
    }
    Tu remarqueras que j'utilise le descripteur de format "%s" pour afficher, car on a affaire à des chaînes de caractères.
    Pour le teste des boucles for on utilise plutôt < (taille du tableau) que <= (indice du dernier élément) ( Je ne sais pas quel cours tu suis ? Aucun ne donne ce modèle de boucle for)

    Pour poster tes codes, tu clique sur le bouton # de l'editeur de message et tu mets ton code entre les deux [CODE] [\CODE]
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  17. #17
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Merci beaucoup pour le code et les conseils. Je pense que j'utilise mal les pointeurs et surtout je ne sais pas quand les utiliser. A quoi sert la ligne Copie[i][2]='\0'; dans la fonction ?
    Ha non c'est bon j'ai compris, c'est logique en fait.

  18. #18
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Citation Envoyé par labo1 Voir le message
    A quoi sert la ligne Copie[i][2]='\0'; dans la fonction ?
    Alors le '\0' c'est tout simplement le caractère de fin de chaîne. Comme tu souhaitais faire des chaînes de caractères, il faut l'ajouter, il ne ce met pas tout seul.
    Tes chaînes Copie ont 2 caractères en position 0 et 1 alors on met le '\0' en position 2.

    Citation Envoyé par labo1 Voir le message
    Je pense que j'utilise mal les pointeurs.
    Dans ce code, avec l'utilisation des crochets [], ils sont peu visible les pointeurs. Vaut peut-être mieux te perfectionner sur ce que tu as vu (variable, tableaux, fonctions, chaîne de caractères...) avant d'aborder les pointeurs.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 20
    Par défaut
    Et j'ai une autre question: est-ce que c'est possible de comparer deux tableaux de chaine de caractères qui n'ont pas les mêmes dimensions ? Par exemple un tableau 1D et un tableau 2D (si possible sans les pointeurs).
    Eh bien en fait, j'ai vu les pointeurs mais même après les avoir travailler énormément dans mon coin, j'ai toujours du mal. Je pense que je les utilise plutôt bien lorsqu'il s'agit uniquement de tableaux 1D mais dès qu'on passe à 2D, je suis perdu.
    Et là c'est encore pire car on mélange les tableaux 1D avec les 2D donc je ne sais pas par quel bout prendre le problème.
    Quand je disais comparer deux tableaux, je voulais dire avoir une fonction qui retourne 1 si les deux chaines sont les mêmes et -1 ou 0 sinon. En fait je ne sais pas comment comparer juste certaines lignes du tableau 2D avec l'unique ligne du tableau 1D.
    Comme je l'ai dit, tant qu'on reste en 1D ça va mais sinon...

  20. #20
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Tu devrais lire un cours si ce n'est pas le cas, parce que tu te fait trop d'imagination.
    Citation Envoyé par labo1 Voir le message
    Quand je disais comparer deux tableaux, je voulais dire avoir une fonction qui retourne 1 si les deux chaines sont les mêmes et -1 ou 0 sinon.
    C'est justement ce que fait la fonction : strcpy. (En ce qui conserne les chaînes de caractères).
    Pour accéder à une chaîne de ton tableau Copie tu écris tout simplement Copie[0] pour la première, Copie[1] pour la seconde, ect...
    Essais de faire des exercices.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Copier une table dans une autre tous les Lundi
    Par popovitch130 dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/09/2008, 15h41
  2. Réponses: 1
    Dernier message: 18/03/2008, 16h05
  3. Copie de feuilles d'un classeur dans l'autre
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/11/2007, 12h06
  4. [Spip] Tableau non affiché dans la partie "Articles les plus récents"
    Par Gigi95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 27/09/2007, 12h27
  5. Pb: copie du contenu d'un repertoire dans un autre
    Par kam81 dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2007, 12h10

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