En supposant que vous avez un char[fixed_size] comme affiché, plutôt qu'un char*, vous pouvez utiliser une seule macro créative pour tout faire en une fois avec un ordre de type cout plutôt que le format disjoint de style printf. Si vous travaillez avec des systèmes embarqués, cette méthode vous permettra de laisser de côté la grande famille de fonctions printf comme snprintf()
(Cela empêche dietlibc de se plaindre aussi) et ne nécessite même pas que malloc()
ou toute fonction de <string.h>
.
#include <unistd.h> //for write
//note: you should check if offset==sizeof(buf) after use
#define strcpyALL(buf, offset, ...) do{ \
char *bp=(char*)(buf+offset); /*so we can add to the end of a string*/ \
const char *s, \
*a[] = { __VA_ARGS__,NULL}, \
**ss=a; \
while((s=*ss++)) \
while((*s)&&(++offset<(int)sizeof(buf))) \
*bp++=*s++; \
if (offset!=sizeof(buf))*bp=0; \
}while(0)
char buf[100];
int len=0;
strcpyALL(buf,len, argv[0],": ", cmd_argv[0],": ",cmd_argv[1]);
if (len==sizeof(buf))write(2,"error\n",6);
else write(1,buf,len);
- Note 1, vous pouvez utiliser n'importe quelle fonction qui produit un char*, y compris les fonctions non standard comme itoa() pour convertir des entiers en chaînes de caractères.
- Note 2, si vous utilisez une bibliothèque partagée ou si vous utilisez déjà une fonction de style printf n'importe où dans votre programme construit statiquement, la seule raison de ne pas utiliser snprintf() (puisque le code compilé serait plus grand avec cette méthode) serait que puisqu'elle est inlined et n'appelle aucune fonction externe, elle devrait être relativement rapide.