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 :

ajouter [une chaîne de caractères ] tableau char


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    lycéen
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut ajouter [une chaîne de caractères ] tableau char
    Bonjour,

    je suis débutant , j'apprends maintenant en langage c[ les tableaux ], j'ai affiché un tableau (char) et je veux ajouter une chaîne de caractères 'bonjour' au tableau pour afficher par ex chaine1 bonjour)

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <string.h>
    #include <stdio.h>
    int   main()
    {
    char tab[100][100];
     
    strcpy(tab[0], "str1" );
    strcpy(tab[1], "str2" );
     
    printf("[%s] [%s]\n", tab[0], tab[1]);
    }
    Résultat:
    [chaine1] [chaine2]

    sans utiliser la fonction strcopy() ,je cherche la solution la plus difficile peut être pour comprendre .

    Je suppose qu 'il s'agit ici d'un tableau (char) contenant une chaîne de caractère , et ne pas d'une chaîne de caractère , donc ajouter une autre chaîne doit manipulé successivement à l'intérieur du tableau prenant en compte les paramètres du tableau contenant une chaîne de caractères()

    j'ai essayé cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab[0] = *tab+'a';
     
     print("%s%c",tab[0]);

    mais sans résultat

    encore j'ai essayé de faire appel au secours ( le bibliotique string ) avec la fonction strcat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcat( tab(0),chaine1]) ;
    chaine 1: je dois la créer ()

    et merci

  2. #2
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut, oui il te faut utiliser la fonction strcat pour faire ce que tu veux.
    Mais attention, si je ne dis pas de bêtises ?! strcat ne vérifie pas que la destination puisse contenir entièrement le résultat de la concaténation. Le résultat peut être donc aléatoire.
    Tu as la fonction strncpy qui permet de spécifier n caractères à concaténer à la suite de la source pour plus de sécurité.
    Visiblement tu souhaites re coder la fonction toi même alors pas de soucis.
    Cependant, l'utilisation de tableaux comme ceux que tu utilises 'tab[]' n'est pas conseillé pour ce genre d'opérations ; si je ne dis pas de bêtises ,à moins d'être parfaitement sur de ce que tu fais.
    Je ne sais pas si tu a vu l'allocation de pointeurs, tu devrais regarder de ce côté là sinon.

    Voilà ce qu'il faudrait faire dans ton cas bien que ce ne soit pas l'idéale mais faut bien commencer par quelque chose.
    Je te propose ce code pour faire ce que tu veux :

    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
    32
     
    int main()
    {
        char s1[9]="str1";
        const char s2[]=" str2";
        str_concat(s1,10,s2);
        printf("Resultat de la concatenation : %s", s1);
        return 0;
    }
     
    void str_concat(char *destination, int taille_max_destination, const char *source)
    {
        int i = strlen(destination); // taille "réelle" de la chaine de destination
        int j = strlen(source); // taille de la chaine source 
     
        // On vérifie que la taille "réelle" de la chaine de destination + celle de la source 
        // est inférieur ou égale à la taille maximale que peut accepter la destination
        // +1 car il ne faut pas oublier le caractère de terminison de chaine de caractère qui est \0
        if ( i + j + 1 <= taille_max_destination )
        {
            // A partir de la taille réélle i de la destination on copie la source
            int k;
            for( k=i ; k<i+j ; k++ )
                destination[k]=source[k-i];
     
            //On oublie pas de terminer par \0
            destination[k]='\0';
        }
        else printf("\n Il n'y a pas assez de place pour concatener la destination dans la source");
     
        return destination;
    }
    Le résultat de la concaténation est celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Resultat de la concaténation : str1 str2


    Cordialement

  3. #3
    Candidat au Club
    Homme Profil pro
    lycéen
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci pour les explications

    ce que je veux faire ajouter une [lettre ou un mot ] dans un tableau char contenant une autre chaîne de caractère ici ( tab[0],"str1 ") il s'agit d'une chaîne de caractère est str1) pour ajouter "bonjour " prenant en compte qu'il s'agit d'un tableau qui contient deux élément (tab[0] et tab[1] .

    en ton code tu génère deux chaines de caractères en ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     char s1[9]="str1";
     const char s2[]=" str2";
    la la concaténation avec strcat() de la bibliothèque [string ] ou de créer une fonction sans faire appel à la bibliothèque (string) fait ajouter une chaîne de caractère à une autre !

    ce que je veux c'est de générer une chaîne (un mot ou une lettre ) mais à l'intérieur d'un tableau de type char .

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 086
    Points : 15 501
    Points
    15 501
    Billets dans le blog
    9
    Par défaut
    L'exemple de code proposé est intéressant, mais j'ai un avertissement du compilateur :

    [Warning] C:\Program Files\C-Free Standard\samples\concat.c:33: warning: `return' with a value, in function returning void
    Ne faudrait-il pas remplacer void par le type approprié ?

  5. #5
    Candidat au Club
    Homme Profil pro
    lycéen
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    L'exemple de code proposé est intéressant, mais j'ai un avertissement du compilateur :



    Ne faudrait-il pas remplacer void par le type approprié ?
    oui justement qu'il n' a fait pas attention ()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int str_concat(char *destination, int taille_max_destination, const char *source)

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il te faut être plus clair sur ce que tu veux faire car des phrases comme
    Je suppose qu 'il s'agit ici d'un tableau (char) contenant une chaîne de caractère , et ne pas d'une chaîne de caractère ,...
    ...donc ajouter une autre chaîne doit manipulé successivement à l'intérieur du tableau prenant en compte les paramètres du tableau contenant une chaîne de caractères()
    sont (pour moi) incompréhensibles

    je veux c'est de générer une chaîne (un mot ou une lettre ) mais à l'intérieur d'un tableau de type char .
    Mais une chaine est toujours un tableau de type char.

  7. #7
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Oui c'est normal et c'est de ma faute, j'ai oublié d'enlever le return =)
    La fonction est bien de type void.
    Tu ne modifie pas les adresses mémoires de tes chaines, tu ne modifies que le contenu. Qui plus est, tu écries dans une chaine existante et non dans une nouvelle.

    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
    int main()
    {
        char s1[9]="str1";
        const char s2[]=" str2";
        str_concat(s1,10,s2);
        printf("Resultat de la concatenation : %s", s1);
        return 0;
    }
     
    void str_concat(char *destination, int taille_max_destination, const char *source)
    {
        int i = strlen(destination); // taille "réelle" de la chaine de destination
        int j = strlen(source); // taille de la chaine source 
     
        // On vérifie que la taille "réelle" de la chaine de destination + celle de la source 
        // est inférieur ou égale à la taille maximale que peut accepter la destination
        // +1 car il ne faut pas oublier le caractère de terminison de chaine de caractère qui est \0
        if ( i + j + 1 <= taille_max_destination )
        {
            // A partir de la taille réélle i de la destination on copie la source
            int k;
            for( k=i ; k<i+j ; k++ )
                destination[k]=source[k-i];
     
            //On oublie pas de terminer par \0
            destination[k]='\0';
        }
        else printf("\n Il n'y a pas assez de place pour concatener la destination dans la source");
     
        //return destination; A supprimer
    }
    J'ai rajouté la fonction str_cpy, pour initialiser tes tab[0] et tab[1].
    Normalement, cela doit maintenant correspondre à ce que tu souhaitais faire initialement.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    void str_cpy(char *destination, int taille_max_destination, const char *source)
    {
        int j = strlen(source); // taille de la chaine source
     
        //On vérifie que la taille de la chaine de caractère de la chaine source est au plus égale à celle de la source
        if ( j+1 <= taille_max_destination )
        {
            // A partir de la taille réélle i de la destination on copie la source
            int k;
            for( k=0 ; k<j ; k++ )
                destination[k]=source[k];
     
            //On oublie pas de terminer par \0
            destination[k]='\0';
        }
        else printf("\n Il n'y a pas assez de place pour copier la destination dans la source");
    }
     
    void str_concat(char *destination, int taille_max_destination, const char *source)
    {
        int i = strlen(destination); // taille "réelle" de la chaine de destination
        int j = strlen(source); // taille de la chaine source
     
        // On vérifie que la taille "réelle" de la chaine de destination + celle de la source
        // est inférieur ou égale à la taille maximale que peut accepter la destination
        // +1 car il ne faut pas oublier le caractère de terminison de chaine de caractère qui est \0
        if ( i + j + 1 <= taille_max_destination )
        {
            // A partir de la taille réélle i de la destination on copie la source
            int k;
            for( k=i ; k<i+j ; k++ )
                destination[k]=source[k-i];
     
            //On oublie pas de terminer par \0
            destination[k]='\0';
        }
        else printf("\n Il n'y a pas assez de place pour concatener la destination dans la source");
    }
     
    int main()
    {
        char s1[1][20];
        str_cpy(s1[0],20,"str1");
        str_cpy(s1[1],20," bonjour");
        str_concat(s1[0],20,s1[1]);
        printf("Resultat de la concatenation : %s", s1);
        return 0;
    }
    Cdt.

  8. #8
    Candidat au Club
    Homme Profil pro
    lycéen
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci diogene tu es si gentil pour votre attention ()

    maintenant est plus clair l'important que j'ai au moins compris

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Attention, cette ligne char s1[1][20]; devrait etre char s1[2][20];.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 02/08/2008, 04h34
  2. Créer un tableau à 2D et insérer une chaîne de caractères
    Par javamateur dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/03/2008, 10h16
  3. Remplir une chaîne de caractère dans un tableau
    Par Windsor123 dans le forum C
    Réponses: 4
    Dernier message: 03/11/2007, 01h29
  4. Réponses: 3
    Dernier message: 24/10/2007, 01h47
  5. Réponses: 4
    Dernier message: 24/07/2006, 17h34

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