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
[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
A voir également:
- Problème d'ajout dans chaîne de caractère
- Caractère ascii - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Caractère spéciaux mac clavier - Guide
- Chaine tnt gratuite sur mobile - Guide
2 réponses
Utilisateur anonyme
Modifié par le père. le 8/12/2016 à 10:32
Modifié par le père. le 8/12/2016 à 10:32
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.
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.
[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
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 :
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
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 :
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
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
[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
8 déc. 2016 à 10:16
chez moi, cela fonctionne comme prévu :
donne :
Dal
#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
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
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 ! :)
Merci quand même de m'avoir mis sur la voie ! :)
[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
8 déc. 2016 à 10:45
arf, merci le père, oui, il faudrait faire
je me rappelle maintenant pourquoi j'ai horreur de strcat :-)
Dal
char message[200]; message[0] = '\0';
je me rappelle maintenant pourquoi j'ai horreur de strcat :-)
Dal
[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
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 à
Dal
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
Modifié par [Dal] le 8/12/2016 à 12:32
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