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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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

  6. #6
    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)

  7. #7
    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.

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