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 :

Concatenation de 2 chaines de caractere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 24
    Par défaut Concatenation de 2 chaines de caractere
    Bonjour tous le monde ;
    je veut faire un programme qui fait la Concatenation de 2 chaines de caractere
    mais sans l'utilisation de la fonction strcat mais en utilisant les pointeurs

    voila le code sue j'ai fait ::
    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
     
    #include<stdio.h>
    #include<conio.h>
     
     
    int main()
    {
        char chaine1[100] , chaine2[50] ,taille1 , taille2 ,  *p1 , *p2;
        printf("Entrez successivement les deux chaines : ");
        gets(chaine1);
        gets(chaine2);
        taille1=strlen(chaine1);
        taille2=strlen(chaine2);
        printf("la taille 1 = %d et 2 = %d",taille1 , taille2);
        for(p1=chaine1+taille1,p2=chaine2 ;p2<chaine2+taille2 ;p1++ , p2++)
        {
            *p1=*p2;
        }
        printf("la chaine concatenée : %s",chaine1);
        getch();
    }
    : la concatenation marche mais il s'ajoute quelques caractere incomprehensible a la fin de la liste concatenée
    et je veux regler ce probleme et merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    La chaine1 n'a peut-être pas suffisamment de place pour recevoir les caractères de chaine2 ?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 24
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    La chaine1 n'a peut-être pas suffisamment de place pour recevoir les caractères de chaine2 ?
    fred1599 everywhere si si la chaine resultante a bcp plus d'espace car la chaine concatenée s'affiche et avec des caractere qui s'ajoutent a la fin

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Je ne pense pas non plus, si tu veux utiliser les pointeurs, que les longueurs soit utiles pour faire ce que tu veux.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu oublies qu'une chaine de caractères en C se termine par '\0'
    Si par exemple on a tapé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Hello " // pour chaine1
    "World" // pour chaine2
    Tu auras dans tes tableaux les caractères :
    • chaine1 : {'H', 'e', 'l', 'l', 'o', ' ', '\0', ...}
    • chaine2 : {'W', 'o', 'r', 'l', 'd', '\0', ...}

    les ... désignant les autres caractères (complètement aléatoires) contenus dans la mémoire qui reste dans les tableaux.

    Avec ton code tu ne vas copier que {'W', 'o', 'r', 'l', 'd'} à la suite de chaine1 et vas donc te retrouver avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', ...}
    Ainsi lors de l'affichage avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("la chaine concatenée : %s",chaine1);
    printf va continuer dans nos ... jusqu'à rencontrer une caractère '\0' final, qui peut être n'importe où, même après les 100 caractères que peut contenir chaine1, ce qui a de bonnes chances de faire planter ton programme.

    Ainsi donc rajoute le '\0' à la fin
    Tu peux par exemple le faire en rajoutant le = ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(p1=chaine1+taille1,p2=chaine2 ;p2<=chaine2+taille2 ;p1++ , p2++)
    Remarques :
    • Plutôt que gets, utilise fgets à la place, pour une saisie sécurisée qui t'empêchera de saisir trop de caractères par rapport à la taille de tes tableaux.
    • vérifie que taille1+taille2 < 100, tu ne voudrais pas écrire au delà de ton tableau
    • évite l'utilisation de getch(); et <conio.h> non portable : préfère getchar() dans <stdio.h>
    • Le prototype correct de main en C est :
      et un return qui va avec, c'est mieux

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Tout pareil que Winjerome, je ne vois pas à quel moment tu ajoutes le zéro de fin de chaîne.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Hello,

    Aussi, j''utiliserais une boucle while au lieu de for :
    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
     
    int main(){
        char chaine1[100], chaine2[50], *p1, *p2;
        printf("Entrez successivement les deux chaines : ");
        gets(chaine1);
        gets(chaine2);
     
        p1 = &chaine1[strlen(chaine1)];
        p2 = chaine2;
        while(*p2 != '\0'){
            *p1++ = *p2++;
        }
        *p1 = '\0';
        printf("la chaine concatenée : %s",chaine1);
        getch();
    }

Discussions similaires

  1. Concatener : Chaine de Caractere Prenom Nom
    Par Tonton_glenn dans le forum VBScript
    Réponses: 8
    Dernier message: 04/10/2009, 18h06
  2. Concatenation de chaine de caractere
    Par the-destroyer dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/09/2009, 19h59
  3. Concatenation chaine de caracteres
    Par kurgan71 dans le forum ASP
    Réponses: 9
    Dernier message: 17/04/2007, 17h29
  4. Réponses: 4
    Dernier message: 03/11/2006, 17h11
  5. Concaténation de chaine de caractères
    Par joy dans le forum Linux
    Réponses: 5
    Dernier message: 07/07/2003, 13h03

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