Problème d'ajout dans chaîne de caractère
Résolu
Snykeur
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
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 :
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);
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.-
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
-
-
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-
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 -
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 -
-
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
-