Problème d'ajout dans chaîne de caractère

Résolu/Fermé
Snykeur - 7 déc. 2016 à 23:58
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 8 déc. 2016 à 12:17
Bonsoir,

Je souhaite créer une chaîne de caractère qui stockerai toute les variables dont j'ai besoin pour ne former qu'une seul phrase. J'ai donc déclaré une chaîne de caractère de taille 100 mais quand je la remplis en faisant des strcat() pour ajouter toute les variables que je désire mettre dedans et bien arrivé au dernier strcat() la variable s'ajoute au début de la chaîne, comme si j'avais atteint la limite de celle-ci et qu'il revenait au début pour l'ajouter. J'ai essayé d'augmenter la taille de la chaîne mais rien ne change et je ne comprends pas pourquoi...
Je viens donc recueillir vos précieux conseils car j'avoue que je n'y comprends plus grand chose là...
Merci d'avance pour vos réponses !

PS : voici le code qui pose problème :
char message[100];

strcat(message,"MVT ");
strcat(message, pseudo);
strcat(message," ");
strcat(message,l);
strcat(message," ");
strcat(message,c);
strcat(message," ");
strcat(message,p);
strcat(message," ");
strcat(message,direction);

printf("%s\n",message);


A voir également:

2 réponses

Bonjour

Chez moi, ça se passe mal et ça ne m'étonne pas, puisque la chaîne message n'est pas initialisée et contient n'importe quoi avant l'exécution du premier strcat ou strncat.
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/12/2016 à 12:32
bravo le père., j'ai remonté ta réponse :-)

effectivement, il faudrait l'initialiser, par exemple comme ceci ou comme cela

dans ce genre de cas, je préfère nettement utiliser snprintf() en C99, pour éviter ce type d'erreurs d'inattention et d'avoir à gérer des concaténations successives
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/12/2016 à 09:18
Salut Snykeur,

Sans savoir comment sont déclarées les différentes variables que tu passes en 2ème argument, et ce qu'elles contiennent, c'est difficile de dire quel est ton problème, car on ne peut pas le reproduire.

http://www.cplusplus.com/reference/cstring/strcat/

le prototype est :
char * strcat ( char * destination, const char * source );
, donc le 2ème argument doit aussi être une chaîne C.

dans ton code, pseudo, l, c, p et direction sont-ils bien du bon type et que contiennent-ils (fournit du code reproduisant ton problème avec les déclarations et le contenu de ces variables) ?

autrement, pour concaténer deux chaînes C, strncat() est préférable, pour éviter les débordements.

alternativement snprintf() en C99, te permettra de formater en une fois toutes tes variables en une chaîne quelque soit leur type en utilisant le spécificateur correspondant et tout en contrôlant l'absence de débordement.


Dal
0
Salut Dal,

Merci pour ta réponse ! J'ai essayé du coup de remplacer les strcat() par strncat() mais rien n'a changé j'ai toujours se problème de retour au début de la chaîne.
Et oui mes variables sont toute de type chaîne de caractère voici le code ci-joint pour mieux comprendre :
void Deplacement(char *pseudo, char *direction,char *l, char *c, char *p)
{
char message[200];

strncat(message,"MVT ",5);
strncat(message, pseudo,50);
strncat(message," ",1);
strncat(message,l,4);
strncat(message," ",1);
strncat(message,c,4);
strncat(message," ",1);
strncat(message,p,5);
strncat(message," ",1);
strncat(message,direction,7);

printf("%s\n",message);

}

Les variables l, c et p sont des entiers que j'ai converti avant l'appelle de la fonction en chaîne de caractère, et pseudo et direction, des chaînes de caractère de base.
Dans mon exemple :
pseudo = SNYKEUR
l = 1
c = 0
p = 20
direction = HAUT
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 déc. 2016 à 10:16
chez moi, cela fonctionne comme prévu :

#include <stdio.h>
#include <string.h>

void Deplacement(char *pseudo, char *direction,char *l, char *c, char *p) {
    char message[200];

    strncat(message,"MVT ",5);
    strncat(message, pseudo,50);
    strncat(message," ",1);
    strncat(message,l,4);
    strncat(message," ",1);
    strncat(message,c,4);
    strncat(message," ",1);
    strncat(message,p,5);
    strncat(message," ",1);
    strncat(message,direction,7);

    printf("%s\n",message);

}

int main(void) {
    Deplacement("toto", "nord", "10", "11", "12");

    return 0;
}

donne :
$ gcc -Wall snykeur.c
$ ./a.out
MVT toto 10 11 12 nord
$

Dal
0
Snykeur > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
8 déc. 2016 à 10:40
J'ai finalement trouvé d'où venait le problème j'avais une variable qui était mal initialisée qui bougeait toute la chaîne.
Merci quand même de m'avoir mis sur la voie ! :)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 déc. 2016 à 10:45
arf, merci le père, oui, il faudrait faire

    char message[200];
    message[0] = '\0';

je me rappelle maintenant pourquoi j'ai horreur de strcat :-)

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/12/2016 à 12:19
donc, le père. a totalement raison et je n'avais pas les yeux en face des trous ce matin.

Alternativement à
message[0] = '\0';
proposé ci-dessus pour initialiser à une chaîne vide ta variable avant les strncat(), tu peux faire en sorte que le premier élément soit copié, et non pas concaténé, avec un strncpy()

#include <stdio.h>
#include <string.h>

void Deplacement(char *pseudo, char *direction,char *l, char *c, char *p) {
    char message[200];

    strncpy(message,"MVT ",5);    /* initialisation message */
    strncat(message, pseudo,50);  /* concaténations ensuite */
    strncat(message," ",1);
    strncat(message,l,4);
    strncat(message," ",1);
    strncat(message,c,4);
    strncat(message," ",1);
    strncat(message,p,5);
    strncat(message," ",1);
    strncat(message,direction,7);

    printf("%s\n",message);

}

int main(void) {
    Deplacement("toto", "nord", "10", "11", "12");

    return 0;
}

Dal
0