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 chaines


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut Concatenation de chaines
    Bonjours à tous.

    Voila, je suis débutant dans la programmation et dans le language C et j'ai un petit problème sur un exercice que j'ai à faire.

    Le but de l'éxerice est de copier plusieur fois le même mot à la suite, le mot etant fournis par l'utilisateur ainsi que le nombre d'occurence.
    Par exemple, si l'utilisateur rentre le mot "programmation" et le nombre "5", le programme devra alors afficher:
    "programmationprogrammationprogrammationprogrammationprogrammation".
    J'ai essayé de le faire avec la commande strcat dans une boucle for mais sa ne marchait pas. Je voudrais savoir si quelqu'un savait comment faire.
    Voila, merci .

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Tu peux tout a fait utiliser strcat.

    Publie ton code, pour voir ce qui ne marche pas.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il faut que tu alloues une chaîne "assez longue", typiquement n fois la longueur de la chaîne plus 1 pour le zéro terminal.
    N'oublie pas de désallouer la chaîne à la fin du prog.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Tu alloue l'espace nécessaire pour tout faire rentrer, et tu rajoute à la suite avec strcat(). Voila ce que je propose :

    Code C : 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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char *creerLaChaine(char *mot, int repetition)
    {
         if ((mot != NULL) && (repetition > 0)){
              char *retour = malloc(strlen(mot) * repetition + 1);
     
              if (retour != NULL)
              {
                   int i = 0;
                   for(i = 0;i < repetition;i++)
                   {
                        strcat(retour, mot);
                   }
     
                   return retour;
              }
         }
         return NULL;
    }
     
     
    int main()
    {
         printf("chaine creee:'%s'\n", creerLaChaine("programmation", 6));
         return 0;
    }

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                  int i = 0;
                   for(i = 0;i < repetition;i++)
                   {
                        strcat(retour, mot);
    euhhh....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                 int i = 0;
                   for(i = 0;i < repetition;i++)
                  {
                      if ( i == 0 )
                         strcpy (retour, mot );
                       else
                        strcat(retour, mot);

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Spootnik
    Tu alloue l'espace nécessaire pour tout faire rentrer, et tu rajoute à la suite avec strcat(). Voila ce que je propose :

    Code C : 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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char *creerLaChaine(char *mot, int repetition)
    {
         if ((mot != NULL) && (repetition > 0)){
              char *retour = malloc(strlen(mot) * repetition + 1);
     
              if (retour != NULL)
              {
                   int i = 0;
                   for(i = 0;i < repetition;i++)
                   {
                        strcat(retour, mot);
                   }
     
                   return retour;
              }
         }
         return NULL;
    }
    Je vois un petit problème. malloc() d'initialise pas la mémoire alloué à 0 (contrairement à calloc()). Donc, à priori, tu dois initialiser la chaîne retour comme une chaîne vide avant d'utiliser strcat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (retour != NULL)
    {
        int i = 0;
        retour[0] = '\0';
        for(i = 0; i < repetition; i++)
        {
            strcat(retour, mot);
        }
     
        return retour;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (retour != NULL)
    {
        int i = 0;
        strcpy(retour, "");
        for(i = 0; i < repetition; i++)
        {
            strcat(retour, mot);
        }
     
        return retour;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    oui, désolé pour l'oubli, donc en résumé ça donne ça :
    Code C : 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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char *creerLaChaine(char *mot, int repetition)
    {
        if ((mot != NULL) && (repetition > 0)){
            char *retour = malloc(strlen(mot) * repetition + 1);
     
            if (retour != NULL)
            {
                strcpy(retour, "");
     
                int i = 0;
                for(i = 0;i < repetition;i++)
                {
                    strcat(retour, mot);
                }
     
                return retour;
            }
        }
        return NULL;
    }
     
     
    int main()
    {
        printf("chaine creee:'%s'\n", creerLaChaine("programmation", 6));
        return 0;
    }

    Voila

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Si tu ne fais pas la supposition que tout le mode dispose d'un compilateur qui supporte C99, les variables (comme i) doivent être définies en début de bloc. Si tu veux être portable, inverse 'int i = 0;' et 'strcpy(retour, "");'.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    ah… je ne le savais pas, merci pour l'info

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je dirais même plus

    En général c'est mieux dans ce cas-là (où une routine fait une fonction) de déclarer la variable pour la routine..

    A part quelques cas (en particulier pour le debug) où on peut être tenté de mettre des variables dans un petit bout de code local, c'est plus clair et plus portable et plus lisible de le mettre directement au début de la fonction..

    Imagines qu'il te faille écrire la spécification de la fonction :

    En entrée : .....
    En sortie : ....
    Utilise : ....

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spootnik
    Tu alloue l'espace nécessaire pour tout faire rentrer, et tu rajoute à la suite avec strcat(). Voila ce que je propose :
    Nan. On est pas là pour faire les devoirs des élèves. On sait que tu sais le faire. Faut se retenir. Oui, c'est difficile...

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Nan. On est pas là pour faire les devoirs des élèves. On sait que tu sais le faire. Faut se retenir. Oui, c'est difficile...
    D'ailleurs il a pas répondu

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    euhhh....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                 int i = 0;
                   for(i = 0;i < repetition;i++)
                  {
                      if ( i == 0 )
                         strcpy (retour, mot );
                       else
                        strcat(retour, mot);
    Une façon compliquée de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          int i;
          strcpy (retour, mot );
          for (i = 1; i < repetition; i++)
          {
             strcat(retour, mot);
          }
    ou tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          int i;
          *retour= 0;
          for (i = 0; i < repetition; i++)
          {
             strcat(retour, mot);
          }

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Au lieu de strcpy(retour, ""); on peut faire simplement *retour = 0;
    [edit] grillé par Emmanuel, apparemment [/edit]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spootnik
    oui, désolé pour l'oubli, donc en résumé ça donne ça
    Je ne comprends toujours pas pourquoi il y a 2 return... D'autre part, tu n'est pas obligé de créer une fuite mémoire...

    Qu'est-ce qui ne va pas avec ça ? Trop simple ?
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    char *creerLaChaine (char const *mot, int repetition)
    {
       char *retour = NULL;
       if (mot != NULL && repetition > 0)
       {
          retour = malloc (strlen (mot) * repetition + 1);
     
          if (retour != NULL)
          {
             *retour = 0;
     
             int i = 0;
             for (i = 0; i < repetition; i++)
             {
                strcat (retour, mot);
             }
          }
       }
       return retour;
    }
     
    int main (void)
    {
       char *s = creerLaChaine ("programmation", 6);
       if (s != NULL)
       {
          printf ("chaine creee:'%s'\n", s);
          free (s), s = NULL;
       }
       return 0;
    }

  16. #16
    Membre averti
    Inscrit en
    Février 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Février 2007
    Messages : 26
    Par défaut
    Merci a tous pour toute ces réponses, mon programme marche trés bien grace a toute vos indications. j'avais pas pensé a copier mon mot dans une chaine vide, j'essayé de le copier a directement en faisant strcat(mot, mot) et sa me donnais un peu n'importe quoi mais la c'est nikel. Encore merci à tous.
    Bon week-end .

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    Imagines qu'il te faille écrire la spécification de la fonction :

    En entrée : .....
    En sortie : ....
    Utilise : ....
    Justement, je ne vois pas le rapport avec les variable locales et le faite que leur portée puisse être réduite au minium, ce qui est une Bonne Chose.

    http://emmanuel-delahaye.developpez....tes.htm#portee

    C'est pas parce qu'on ne peut pas le faire dans d'autres langages qu'il faut s'en priver en C...

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    leur portée puisse être réduite au minium, ce qui est une Bonne Chose.
    ben Emmanuel je sais pas..

    Si je vois dans l'entête d'une fonction :

    Utilise les variables i, p...

    Et qu'il faut que je descende et explore la fonction pour voir où c'est utilisé, ou de quel type elles sont, c'est pas forcément ce que j'ai envie de faire...

    Et je trouve, par expérience pour avour fourré mon nez dans du code (long) écrit comme ça, que c'était assez difficile à suivre... Dans le cas précis non, car la routine est courte et simple, mais c'est souvent associé à d'autres pratiques beaucoup plus douteuses (mettre des variables globales ou des include ou define au beau milieu d'un module, etc...).

    M'enfin c'est juste une opinion....

  19. #19
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Nan. On est pas là pour faire les devoirs des élèves. On sait que tu sais le faire. Faut se retenir. Oui, c'est difficile...
    euh… oui en effet j'ai pas pu me retenir . Promis je referai plus .

    Citation Envoyé par souviron34
    D'ailleurs il a pas répondu
    Suffit de me laisser le temps .

    Citation Envoyé par Emmanuel Delahaye
    C'est simplement quelque chose que je n'ai pas encore l'habitude d'utiliser.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *retour = 0;
    // et
    retour[0] = 0;
    // ou peut-être plutôt
    retour[0] = '\0';

    ça revient au même non ?

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Spootnik
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *retour = 0;
    // et
    retour[0] = 0;
    // ou peut-être plutôt
    retour[0] = '\0';

    ça revient au même non ?
    Oui

    Et pour l'autre

    Suffit de me laisser le temps .
    c'était pas destiné à toi mais à Rydley (qui a fini par répondre entretemps ;-) )

Discussions similaires

  1. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 15h25
  2. [Oracle 8i/ Sql] Concatener une chaine
    Par dimdidi dans le forum Oracle
    Réponses: 5
    Dernier message: 07/02/2006, 13h42
  3. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08
  4. Réponses: 2
    Dernier message: 01/07/2004, 11h36
  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