29 votes

meilleur moyen de concaténer plusieurs chaînes de caractères en c ?

Existe-t-il un meilleur moyen de concaténer plusieurs chaînes de caractères en c que de faire plusieurs appels à strcat() à la suite, comme ci-dessous ?

char prefix[100] = "";
strcat(prefix, argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[0]);
strcat(prefix, ": ");
strcat(prefix, cmd_argv[1]);
perror(prefix);

3voto

technosaurus Points 1980

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.

2voto

Lucky Murari Points 2097

Vous pouvez utiliser snprintf fonction

char prefix[100];
snprintf(prefix, 100, "%s: %s: %s", argv[0], cmd_argv[0], cmd_argv[1]);

1voto

Lily AB Points 219

Tu ne pourrais pas utiliser un Macro.

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

#define a argv[0]
#define b argv[1]
#define c argv[2]
#define strcat1(a,b,c) strcat(prefix, a);\
                       strcat(prefix, ": ");\
                       strcat(prefix, b);\
                       strcat(prefix, ": ");\
                       strcat(prefix, c);\
                       perror(prefix);\

int main(int argc, char *argv[]){
    char prefix[100] = "";
    strcat1(a,b,c);
    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X