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 de caractères


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut Concaténation de chaînes de caractères
    Hello,

    Débutant en C je souhaite concaténer des chaînes de caractères.
    Voila un bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char mess[] = "message numéro ";
    int num = 0;
     
    int i;
     
    for (i=1; i<4; i++)
    {
        //je ne sais pas comment faire pour afficher "message numéro i"
    }
    Comment concaténer un char et un int ?
    Merci pour votre aide

  2. #2
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Salut,

    Jette un coup d'oeil à la fonction sprintf.

  3. #3
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par Freed0
    Salut,

    Jette un coup d'oeil à la fonction sprintf.
    sprintf est source de buffer overflow

    Utilise snprintf, ou printf pour afficher à l'écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s %d\n", mess,i);

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    Merci pour vos réponse,
    Mais comment, par exemple, concaténer un char et un int.

    Par exemple en Java on peut faire :
    Mais en C c'est pas possible.
    Pour info, j'ai utilisé la fonction 'strcat' mais ca ne marche pas...

  5. #5
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Avec snprintf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char mess[] = "message numéro"; 
    int len = strlen(mess) +2; // 2 = espace + 1 chiffre
    char buffer[len];   
    int i;  
    for (i=1; i<4; i++) {
       snprintf(buffer, len, "%s %d",mess, i);
       printf("%s\n",buffer);
    }
    Avec printf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char mess[] = "message numéro";
    int i;   
    for (i=1; i<4; i++) {  
       printf("%s %d\n", mess,i);
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par v4np13
    sprintf est source de buffer overflow
    Si on code avec les pieds, oui.
    Utilise snprintf, ou printf pour afficher à l'écran:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s %d\n", mess,i);
    snprintf() n'est pas C90.

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    On tourne en rond...

    Je reformule donc ma question :
    Je veux construire une chaîne de caractère composée de 'mer' + 'i'.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char mess[] = "i = ";
    int i = 2;
     
    //construire mess = mess + i
    ???
     
    //afficher la nouvelle valeur de 'mess'
    printf(mess);
    J'ai testé ton code v4np13 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char mess[] = "i = "; 
    int len = strlen(mess) +2; // 2 = espace + 1 chiffre
    char buffer[len];   
    int i = 2;  
     
    snprintf(buffer, len, "%s %d",mess, i);
    printf("%s\n",buffer);
    }
    Mais ce ne marche pas. J'ai à l'écran : "i = "
    mais pas de valeur ...

  8. #8
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Cela fonctionne :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main()
    {
        char mess[] = "i = ";
        int len = strlen(mess) +3; // 3 = espace + 1 chiffre+ 0 final
        char buffer[len];
        int i = 2;
        buffer[len-1]=0; // marqueur de fin
        snprintf(buffer, len, "%s %d",mess, i);
        printf("%s\n",buffer);
        return 0;
    }

  9. #9
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <string.h>
     
    int main(void){
      char mess[] = "i = "; 
      int len = strlen(mess) +3; // 3 = espace + 1 chiffre + '\0'
      char buffer[len];   
      int i = 2;  
     
      snprintf(buffer, len, "%s %d",mess, i);
      printf("%s\n",buffer);
     
      return 0;
    }

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    Exact, ca marche... dsl (avec +3 sur 'len')

    Mais cela signifie qu'il faut connaitre la logueur de 'i' !!
    Si j'initialise 'i = 13' et que je laisse +3, alors le message affiché est :
    i = 1
    Il n'y a pas d'autre solution pour concaténer ?

  11. #11
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Initialiser la taille du buffer assez longue afin de te laisser une marge:

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Zavonen
    Cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
        char mess[] = "i = ";
        int len = strlen(mess) +3; // 3 = espace + 1 chiffre+ 0 final
        char buffer[len];
    Attention les VLA (Variable Length Arrays) ne sont pas compatibles C90. Et en C99, je ne connais pas de compilateur qui les implémente correctement.

    Je recommande le tableau de taille fixe de taille suffisante, ou le tableau dynamique (malloc()/free()) si nécessaire.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sakapatate
    Il n'y a pas d'autre solution pour concaténer ?
    Rien de simple comme ça.

    Le C, c'est rustique, désolé.

  14. #14
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    ok, merci à tous.
    La méthode 'snprintf' en passant par un buffer est pas si mal.

    Bon week, et la prochaine question

    bye

  15. #15
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    on t'as dit que il ne faut pas s'y fier.

    le mieux est sprintf ....

    Standard et compatible et donc portable.

  16. #16
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Attention les VLA (Variable Length Arrays) ne sont pas compatibles C90. Et en C99, je ne connais pas de compilateur qui les implémente correctement.
    Tout à fait d'accord !
    J'ai seulement essayé de faire fonctionner le code proposé pour débloquer la situation

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

Discussions similaires

  1. [Débutant] Concaténation de chaînes de caractères
    Par montaproduction dans le forum LabVIEW
    Réponses: 2
    Dernier message: 11/10/2008, 14h52
  2. Concaténer deux chaînes de caractères
    Par fafabzh6 dans le forum R
    Réponses: 2
    Dernier message: 21/03/2008, 21h03
  3. Réponses: 3
    Dernier message: 23/08/2007, 09h53
  4. Concaténation de chaîne de caractères
    Par Ardely dans le forum Delphi
    Réponses: 6
    Dernier message: 31/01/2007, 19h10
  5. 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

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