snprintf pour la concaténation de chaînes
Je suis à l'aide de snprintf pour concaténer une chaîne de caractères dans un tableau de char:
char buf[20] = "";
snprintf(buf, sizeof buf, "%s%s", buf, "foo");
printf("%s\n", buf);
snprintf(buf, sizeof buf, "%s%s", buf, " bar");
printf("%s\n", buf);
Le problème est le deuxième concaténation de buf
au lieu d'ajouter "bar"
remplace "foo"
avec elle. La sortie est identique:
foo
bar
La première %s
devrait garder buf
(qui dans ce cas est titulaire d'"foo"
). Et la deuxième %s
doit joindre "bar"
. Droit?
Ce que je fais mal?
source d'informationauteur Jermin Bazazian
Vous devez vous connecter pour publier un commentaire.
Vous êtes violation du
restrict
contrat sursnprintf
qui stipule qu'aucun autre argument peut chevaucher le tampon.La copie de l'entrée en elle-même est une perte de temps de toute façon.
snprintf
renvoie le nombre de caractères mise en forme, il faudrait, afin de prendre avantage de cette de l'ajout:Pourquoi ne pas utiliser
strncat()
? Il a été conçu pour faire exactement cela:Si vos systèmes prend en charge, vous pouvez utiliser
strncat_s()
au lieu destrncat
car il a un niveau supplémentaire de protection contre les débordements et évite la nécessité pour le calcul du nombre d'octets restant dans la mémoire tampon de sortie.Si vous doit utilisation
snprintf
vous aurez besoin de créer un pointeur de garder une trace de la fin de la chaîne. Ce pointeur sera le premier argument que vous passez àsnprintf
. Votre code utilise toujoursbuf
ce qui signifie qu'il sera toujours l'impression au début de ce tableau. Vous pouvez soit utiliserstrlen
de trouver la fin de la chaîne après chaquesnprintf
appel, ou vous pouvez utiliser la valeur de retour desnprintf
pour incrémenter le pointeur.Alors que l'on a accepté la réponse est bien, le mieux (à mon avis) la réponse est que la concaténation de chaînes qui est faux. Vous devez construire l'ensemble de la production dans une unique appel à
snprintf
. C'est toute la question de l'utilisation des fonctions de sortie formatée, et c'est beaucoup plus efficace et plus sûr que de faire de l'arithmétique des pointeurs et des appels multiples. Par exemple:Essayez ceci:
De sortie est "foo bar". Le premier argument de snprintf, un pointeur vers un char, est l'endroit où il va commencer à la farce les personnages. Il n'y prête aucune attention à ce qui est dans la mémoire tampon déjà. La fonction strlen ne prêter attention. Il compte le nombre de caractères avant le nul (0) snprintf y mettre. Donc au lieu de passer buf, passer buf+strlen(buf). Vous pouvez également utiliser strncat, ce qui serait un peu plus efficace.
Je vois la balise C++ sous votre question. Rechercher des std::string. Manière de mieux.