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 :

Concaténation de chaînes


Sujet :

C

  1. #1
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut Concaténation de chaînes
    bonjour,
    j'ai fais un petit code dans le but de tester plusieurs facons de lier deux chaines mais je voulais savoir comment resoudre le problème de l'espace.
    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
    #include <stdio.h>
    #include <string.h>
     
    /************************************************************************/
    /* EXERCICE 3: Ecrireune fonction qui à deux chaines en parametre et qui*/
    /* et qui recopie la seconde à la fin de la première; cette fonction    */
    /* retourne la première.                                                */
    /************************************************************************/
     
    char *cetteConcatenation(char *destination, char *source){
    	int i, j;
    	i = j = 0;
    	while(destination[i] != '\0') /* va à la fin de destination */
    		i++;
    	while((destination[i++] = source[j++]) != '\0');/* copie source */
    	return destination;
    } /*version sans string.h */
     
    char *cetteConcatenation2(char *destination, char *source){
    	return strcat(destination, source);
    } /* version avec string.h */
     
    /************************************************************************/
    /*                      PROGRAMME DE TEST                               */
    /************************************************************************/
     
    int main(void){
    	char chaine1[100];
    	char chaine2[100];
    	/* debut test exercice 3 */
    	puts("EXERCICE 3");
    	printf("entrez une Chaine 1 :\n");
    	scanf("%s",chaine1);
    	printf("entrez une Chaine 2:\n");
    	scanf("%s",chaine2);
    	printf("Concatenation :%s\n", cetteConcatenation(chaine1, chaine2));
    	printf("entrez une Chaine 1 :\n");
    	scanf("%s",chaine1);
    	printf("entrez une Chaine 2:\n");
    	scanf("%s",chaine2);
    	printf("Concatenation :%s\n", cetteConcatenation2(chaine1, chaine2));
    	return 0;
    }

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Au lieu d'utiliser la fonction scanf(), utilise la fonction fgets() pour la saisie. En effet, avec scanf(), la conversion s'arrête au premier caractère blanc et il ya un risque de débordement mémoire.

  3. #3
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Merci,
    dans ma premiere fonction j'ai remplacé '\0' par '\n' pour mettre les deux chaines à la suite.
    mais dans la deuxieme cela ne me semble pas possible. me trompe-je ?

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par emprex Voir le message
    Merci,
    dans ma premiere fonction j'ai remplacé '\0' par '\n' pour mettre les deux chaines à la suite.
    mais dans la deuxieme cela ne me semble pas possible. me trompe-je ?
    Non puisque l'erreur vient de ta saisie avec ta fonction scanf().
    Sans modifier ton premier code et en faisant la saisie comme ci dessous, je n'ai pas de soucis d'espace.
    Remplacer les saisies scanf() comme:
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (fgets (chaine1, sizeof(chaine1), stdin) != NULL)
       {
          char *p = strchr (chaine1, '\n');
          if (p)
          {
             *p = 0;
          }
       }
    et notamment en faire une fonction.

    NB: Attention à un éventuel débordement mémoire puisque l'espace alloué pour chaine 1 est équivalent à celui de chaine2.

  5. #5
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    j'ai fais ca
    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
    #include <stdio.h>
    #include <string.h>
     
    /************************************************************************/
    /* EXERCICE 3: Ecrireune fonction qui à deux chaines en parametre et qui*/
    /* et qui recopie la seconde à la fin de la première; cette fonction    */
    /* retourne la première.                                                */
    /************************************************************************/
     
    char *cetteConcatenation(char *destination, char *source){
    	int i, j;
    	i = j = 0;
    	while(destination[i] != '\0') /* va à la fin de destination */
    		i++;
    	while((destination[i++] = source[j++]) != '\0');/* copie source */
    	return destination;
    } /*version sans string.h */
     
    char *cetteConcatenation2(char *destination, char *source){
    	return strcat(destination, source);
    } /* version avec string.h */
     
    /************************************************************************/
    /*                      PROGRAMME DE TEST                               */
    /************************************************************************/
     
    int main(void){
    	char chaine1[100];
    	char chaine2[100];
    	/* debut test exercice 3 */
    	puts("EXERCICE 3");
    	printf("entrez une Chaine 1 :\n");
    	fgets(chaine1, 100, stdin);
    	printf("entrez une Chaine 2:\n");
    	fgets(chaine2, 100, stdin);
    	printf("Concatenation :%s\n", cetteConcatenation(chaine1, chaine2));
    	printf("entrez une Chaine 1 :\n");
    	fgets(chaine1, 100, stdin);
    	printf("entrez une Chaine 2:\n");
    	fgets(chaine2, 100, stdin);
    	printf("Concatenation :%s\n", cetteConcatenation2(chaine1, chaine2));
    	return 0;
    }
    et le resulat est
    Concatenation : ksksksksks
    ddfffff
    or moi je voudrais
    Concatenation : ksksksksksddfffff

  6. #6
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    ok j'ai compris, merci pour tes explications, je maintenant integrer tout ca dans une fonction.
    enfin j'ai un autre probleme,
    après ecrit
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdio.h>
    #include <string.h>
     
    /************************************************************************/
    /* EXERCICE 3: Ecrireune fonction qui à deux chaines en parametre et qui*/
    /* et qui recopie la seconde à la fin de la première; cette fonction    */
    /* retourne la première.                                                */
    /************************************************************************/
     
    char *cetteConcatenation(char *destination, char *source){
    	int i, j;
    	i = j = 0;
    	while(destination[i] != '\0') /* va à la fin de destination */
    		i++;
    	while((destination[i++] = source[j++]) != '\0');/* copie source */
    	return destination;
    } /*version sans string.h */
     
    char *cetteConcatenation2(char *destination, char *source){
    	return strcat(destination, source);
    } /* version avec string.h */
     
    /* fonction de saisie de chaine */
     
    char *saisieChaine(char *chaine){
    	if (fgets (chaine, sizeof(chaine), stdin) != NULL)
       {
          char *p = strchr (chaine, '\n');
          if (p)
          {
             *p = 0;
          }
       }
    	return chaine;
    }
     
     
    /************************************************************************/
    /*                      PROGRAMME DE TEST                               */
    /************************************************************************/
     
    int main(void){
    	char chaine1[100];
    	char chaine2[100];
    	/* debut test exercice 3 */
    	puts("EXERCICE 3");
    	printf("entrez une Chaine 1:\n");
    	saisieChaine(chaine1);
    	printf("entrez une Chaine 2:\n");
    	saisieChaine(chaine2);
    	printf("Concatenation :%s\n", cetteConcatenation(chaine1, chaine2));
    	printf("entrez une Chaine 1 :\n");
    	saisieChaine(chaine1);
    	printf("entrez une Chaine 2:\n");
    	saisieChaine(chaine2);
    	printf("Concatenation :%s\n", cetteConcatenation2(chaine1, chaine2));
    	return 0;
    }
    le programme me demande la premiere chaine et s'execute jusqu'à la fin.
    comme enter etait en mémoire;

  7. #7
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Pour la fonction de saisie d'une chaine que tu as fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char *saisieChaine(char *chaine)
    {
       if (fgets (chaine, sizeof(chaine), stdin) != NULL)
       {
          char *p = strchr (chaine, '\n');
          if (p)
          {
             *p = 0;
          }
       }
    	return chaine;
    }
    Il t'est nécessaire de passer la taille de la chaine en paramètre afin d'utiliser cette valeur avec l'utilisation de fgets().

    En effet, surement que sur ton implémentation sizeof(chaine) = 4, de ce fait tu récupères une chaine de 3 caractères + le caractère de fin de chaine.
    D'autre part, dans ta fonction pourquoi retourner le pointeur "chaine" sachant que tu l'as déjà passé en paramètre.

    Essayes avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void saisieChaine(char *chaine, int taille)
    {
       if (fgets (chaine, taille, stdin) != NULL)
       {
          char *p = strchr (chaine, '\n');
          if (p != NULL)
          {
             *p = 0;
          }
       }
    }

  8. #8
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Super, ca marche, merci pour tes conseils.

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

Discussions similaires

  1. Concaténation de chaînes de caractères
    Par Sakapatate dans le forum Débuter
    Réponses: 15
    Dernier message: 16/06/2007, 22h19
  2. Concaténation de chaîne de caractères
    Par Ardely dans le forum Delphi
    Réponses: 6
    Dernier message: 31/01/2007, 19h10
  3. Comment concaténer des chaînes issues d'un fichier ini ?
    Par Neit_Sabes dans le forum Framework .NET
    Réponses: 10
    Dernier message: 27/09/2006, 09h28
  4. concaténation de chaîne de caractère
    Par jh0483 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/08/2005, 17h10
  5. [XSLT 1.0] Concaténation de chaînes
    Par tofita_49 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 25/07/2005, 18h34

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