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 averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut Concaténation de chaînes de caractères
    Bonjour,

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int i;
    char temp[64] ="toto";
    char num[5];
     
    for (i = 1; i < 5; i++)
    {	
    sprintf(num,"%03d",i);	
    strcat(temp, num);
    printf("Valeur : %s\n", temp);
    }
    Comment faire pour que cela me retourne bien :
    Valeur : toto001
    Valeur : toto002
    Valeur : toto003
    Valeur : toto004

    et non :
    Valeur : toto001
    Valeur : toto001002
    Valeur : toto001002003
    Valeur : toto001002003004

    Est-ce que la fonction strcat est approprié dans ce cas de figure ?

    Merci bien

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

    Au lieu d'utiliser sprintf et strcat, tu pourrais n'utiliser que sprintf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int i;
    char head[] = "toto";
    char temp[64];
     
    for (i = 1; i < 5; i++)
    {	
        sprintf(temp,"%s%03d",head, i);	
        printf("Valeur : %s\n", temp);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    C'est ce que j'avais initialement (à savoir l'utilisation de sprintf) mais cela me fout en l'air le code sur lequel on a échangé :

    http://www.developpez.net/forums/d76...a/#post4416519

    Le problème que je rencontre dixit le lien ci-dessus est lié à l'utilisation de cette fonction sprintf dans le contexte de mon programme. Lorsque je squize cette fonction. Ma boucle tourne. J'ai :
    1 - 1
    1 - 2
    1 - 3
    1 - 4
    1 - 5
    2 - 6
    2 - 7
    2 - 8
    2 - 9
    2 - 10

    Si je concatène, je vais avoir :

    1 - toto1
    2 - toto2
    2 - toto3
    2 - toto4
    2 - toto5
    2 - toto6
    2 - toto7
    2 - toto8
    2 - toto9
    2 - toto10

    Une fois de plus, je suis coincé. Je veux bien t'envoyer le code source (adresse mail en PM) dans sa globalité pour un regard sur ces quelques lignes de codes qui posent problème.

    Merci bien

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par sneakz Voir le message
    Une fois de plus, je suis coincé. Je veux bien t'envoyer le code source (adresse mail en PM) dans sa globalité pour un regard sur ces quelques lignes de codes qui posent problème.
    Non, le MP ne s'impose pas.

    Par contre, décris nous précisément ce que tu souhaites faire ; pour l'instant c'est pas encore clair.

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par mabu Voir le message
    Au lieu d'utiliser sprintf et strcat, tu pourrais n'utiliser que sprintf :
    snprintf() plutôt.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    Je sais que cela n'est pas clair.

    Voici une reprise d'une partie de code qui 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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <signal.h>
    #include <string.h>
    #include <time.h>
    #include <ctype.h>
    #include <errno.h>
     
    void perm (int tab[], int i, int j);
     
    int main()
    {
    int lim[3] = {0, 5, 10};
    int tab[1000];
    int i, c, j, k;
    char nom[5];
     
    /* tableau de nombres aléatoires */
    for (i = 0; i <= 99; i++)
    {
    	tab[i] = i;
    }
     
    for (i = 0; i <= 99; i++)
    {
    	j = (rand() % 99) + 1;
    	k = (rand() % 99) + 1;
    	perm(tab, j, k);
    }
     
    for(i = 1; i < 3; i++) {
    	for (c = lim[i-1]; c < lim[i]; c++)
       	{   			
       		sprintf(nom,"J%03d",tab[c]);	
       		printf("Numéro : %d, Sortie : %s\n", i, nom);
        }
    }
     
    return EXIT_SUCCESS;
    }
     
    void perm (int tab[], int i, int j) 
    {
      int temp; 
      temp = tab[i];
      tab[i] = tab[j];
      tab[j] = temp;
    }
    Donc le résultat souhaité est :

    Numéro : 1, Sortie : J000
    Numéro : 1, Sortie : J083
    Numéro : 1, Sortie : J203
    Numéro : 1, Sortie : J399
    Numéro : 1, Sortie : J026
    Numéro : 2, Sortie : J714
    Numéro : 2, Sortie : J006
    Numéro : 2, Sortie : J414
    Numéro : 2, Sortie : J401
    Numéro : 2, Sortie : J907

    çà c'est l'objectif à atteindre.

    Lorsque j'intègre ce bout de code dans mon programme initial, j'obtiens le même résultat.

    Lorsque je modifie la ligne :

    sprintf(nom,"J%03d",tab[c]);

    par

    sprintf(nom,"/med/J%03d",tab[c]);

    J'obtiens alors :

    Numéro : 1, Sortie : /med/J000
    Numéro : 2, Sortie : /med/J000
    Numéro : 2, Sortie : /med/J621
    Numéro : 2, Sortie : /med/J429
    Numéro : 2, Sortie : /med/J289
    Numéro : 2, Sortie : /med/J262
    Numéro : 2, Sortie : /med/J925
    Numéro : 2, Sortie : /med/J800
    Numéro : 2, Sortie : /med/J775
    Numéro : 2, Sortie : /med/J125
    Numéro : 2, Sortie : /med/J577

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Le problème doit venir du tableau nom qui n'est pas assez grand pour contenir ce que tu veux y mettre... Agrandit le.

    Au passage la remarque de nicolas.sitbon était la bonne : un snprintf aurai permit de ne pas corrompre la mémoire qui est derrière nom. (mais j'ai cru comprendre que cette fonction n'était pas forcément dispo sur tout les compilateurs)

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par mabu Voir le message
    (mais j'ai cru comprendre que cette fonction n'était pas forcément dispo sur tout les compilateurs)
    tu veux "système".
    Tu penses à quel système? sous Windows il y a _snprintf (un petit define fera l'affaire).
    C'est une fonction C99.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    Merci bien pour ces compléments d'info et pour votre aide précieuse. Je me suis contenté d'agrandir la taille du tableau.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 407
    Par défaut
    Attention, la fonction _snprintf() de Visual ne fait pas du tout ce que fait la fonction snprintf() du standard C99!
    • Elle ne peut pas être appelée sur un buffer nul (utiliser _scprintf() à la place).
    • Elle retourne -1 en cas de dépassement
    • Elle ne termine pas la chaîne en cas de dépassement (!)

    Pour avoir le comportement de la vraie snprintf() sous Visual, ceci peut aider:
    http://www.developpez.net/forums/m972738-14/
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attention, la fonction _snprintf() de Visual ne fait pas du tout ce que fait la fonction snprintf() du standard C99!
    • Elle ne peut pas être appelée sur un buffer nul (utiliser _scprintf() à la place).
    • Elle retourne -1 en cas de dépassement
    • Elle ne termine pas la chaîne en cas de dépassement (!)

    Pour avoir le comportement de la vraie snprintf() sous Visual, ceci peut aider:
    http://www.developpez.net/forums/m972738-14/
    A ce tarif là, je préfère encore utiliser les extensions "secure" de Microsoft, la sécurité prime sur la portabilité.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 407
    Par défaut
    Avec le message dont j'ai donné le lien, tu peux cumuler les deux.
    Par contre, tu perds en vitesse (deux appels au lieu d'un seul).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Par contre, tu perds en vitesse (deux appels au lieu d'un seul).
    sincèrement, vu les performances des fonctions d'entrées sorties formatées, personne n'y verra de différence.

Discussions similaires

  1. Concaténer deux chaînes de caractères
    Par fafabzh6 dans le forum R
    Réponses: 2
    Dernier message: 21/03/2008, 21h03
  2. Réponses: 3
    Dernier message: 23/08/2007, 09h53
  3. Concaténation de chaînes de caractères
    Par Sakapatate dans le forum Débuter
    Réponses: 15
    Dernier message: 16/06/2007, 22h19
  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