meilleur moyen d’append char * prefix à char * existant en C

Ce que j’ai:

char * a = "world"; char * b = "Hello"; 

Ce dont j’ai besoin c’est:

 char * a = "Hello World"; 

J’ai besoin d’append b avant a. Y at-il une fonction qui le fait?

Cela peut être fait facilement comme indiqué ci-dessous:

 #include #include #include main() { char * a = "world"; char * b = "Hello"; char *c = malloc(strlen(a)+strlen(b)+1); strcpy(c,b); strcat(c,a); printf("%s\n",c); free(c); } 

Vous pouvez utiliser strcat (3) , snprintf (3) ou asprintf (3)

Avec strcat vous devez vérifier le dépassement de tampon (avec strlen (3) …). Avec strcat & snprintf , vous devez pré-allouer le tableau. Avec asprintf vous asprintf un tampon alloué par tas et vous devez le free manière appropriée.

Donc, en utilisant strcat et un tampon de taille fixe buf :

 char buf[64]; if (strlen(a)+strlen(b) 

Vous pouvez également utiliser un tampon alloué par tas:
char*buf = malloc(strlen(a)+strlen(b)+1); mais n'oubliez pas de vérifier contre l'échec de malloc : if (!buf) { perror("malloc buf"); exit(EXIT_FAILURE); }; if (!buf) { perror("malloc buf"); exit(EXIT_FAILURE); }; et ensuite faire la strcpy & strcat comme avant. Bien sûr, vous devrez free(buf) plus tard au moment opportun. Notez que vous pouvez garder int lena=strlen(a); puis strcpy(buf+lena,b) au lieu d'appeler strcat .

Utilisation de snprintf et d'un tampon de taille fixe buf (inutile de vérifier le dépassement de snprintf la mémoire tampon car la taille de la mémoire tampon est donnée à snprintf ):

 char buf[54]; int len= snprintf(buf, sizeof(buf), "%s%s", a, b); // now buf contains "worldhello" and len contains the required length 

La bonne chose à propos de snprintf est qu’il comprend les chaînes de contrôle du format printf (par exemple %d pour un entier en décimal, %g pour une virgule flottante en notation scientifique, etc ...)

Utilisation de asprintf (sur des systèmes tels que Linux qui le fournit)

 char* buf = asprintf("%s%s", a, b); 

Mais vous devez appeler free(buf) au bon moment pour éviter une fuite de mémoire .

Voir aussi strdup (3) , fmemopen (3) et open_memstream

Dans votre question, vous devriez échanger a et b