Concaténer les chaînes de caractères en C

Jinku Hu 12 octobre 2023
  1. Utiliser les fonctions strcat et strcpy pour concaténer des chaînes de caractères en C
  2. Utiliser la fonction memccpy pour concaténer des chaînes de caractères en C
  3. Utiliser la fonction définie sur mesure pour concaténer des chaînes de caractères littérales en C
Concaténer les chaînes de caractères en C

Cet article explique plusieurs méthodes de concaténation des chaînes de caractères en C.

Utiliser les fonctions strcat et strcpy pour concaténer des chaînes de caractères en C

Strcat fait partie de la bibliothèque C standard de chaînes de caractères définie dans l’en-tête <string.h>. La fonction prend deux arguments char* et ajoute la chaîne stockée au second pointeur à celle du premier pointeur. Comme les chaînes de style C se terminent par le caractère \0, strcat commence à s’ajouter à la chaîne de destination en commençant par le caractère nul. Enfin, la fin d’une chaîne nouvellement construite se termine par le caractère \0. Notez que le programmeur est responsable de l’allocation de la mémoire suffisante au pointeur de destination pour stocker les deux chaînes de caractères.

La seconde fonction à utiliser dans cette solution est strcpy, qui prend de la même façon deux paramètres char* et copie la chaîne au second pointeur vers le premier pointeur. Notez que strcpy est utilisé pour copier la première chaîne dans le tampon char désigné et ensuite passer le pointeur de destination à la fonction strcat.

Les deux fonctions renvoient le pointeur à la chaîne de caractères de destination, et cela rend possible les appels de chaînage.

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

#ifndef MAX
#define MAX 100
#endif

int main() {
  const char* str1 = "hello there 1";
  const char* str2 = "hello there 2";

  char buffer[MAX];
  strcat(strcpy(buffer, str1), str2);
  printf("%s\n", buffer);

  char buffer2[MAX];
  strcat(strcpy(buffer2, "Hello there, "), "Josh");
  strcat(buffer2, "!\nTemporary...");
  printf("%s\n", buffer2);

  exit(EXIT_SUCCESS);
}

Production :

hello there 1hello there 2
Hello there, Josh!
Temporary...

Utiliser la fonction memccpy pour concaténer des chaînes de caractères en C

Le plus gros inconvénient de la méthode précédente est son implémentation inefficace qui effectue des itérations redondantes sur la première chaîne stockée par la fonction strcpy.

La fonction memccpy, en revanche, corrige ce problème et traite les deux chaînes de manière efficace. memccpy ne copie pas plus que le nombre d’octets spécifié par l’utilisateur depuis le char* source vers le pointeur de destination, s’arrêtant seulement lorsque le caractère donné est trouvé dans la chaîne source. memccpy renvoie le pointeur au dernier caractère stocké dans le tampon de destination. Ainsi, deux appels memccpy peuvent être enchaînés de façon similaire à la méthode précédente. La première chaîne est copiée par l’utilisateur dans le tampon pré-alloué, et la seconde chaîne est ajoutée au pointeur renvoyé par le premier appel à memccpy.

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

#ifndef MAX
#define MAX 100
#endif

int main() {
  const char* str1 = "hello there 1";
  const char* str2 = "hello there 2";

  char buffer[MAX];
  memccpy(memccpy(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);

  exit(EXIT_SUCCESS);
}

Production :

hello there 1hello there 2

Utiliser la fonction définie sur mesure pour concaténer des chaînes de caractères littérales en C

Alternativement, si le memccpy n’est pas disponible sur votre plate-forme, vous pouvez définir une fonction personnalisée mettant en œuvre la même routine. concatStrings est l’exemple d’implémentation qui copie un caractère d’un pointeur à un autre jusqu’à ce que le caractère spécifié soit trouvé. Notez que nous spécifions l’octet nul \0 comme caractère d’arrêt dans les deux exemples.

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

#ifndef MAX
#define MAX 100
#endif

void* concatStrings(void* restrict dst, const void* restrict src, int c,
                    size_t n) {
  const char* s = src;
  for (char* ret = dst; n; ++ret, ++s, --n) {
    *ret = *s;
    if ((unsigned char)*ret == (unsigned char)c) return ret + 1;
  }
  return 0;
}

int main() {
  const char* str1 = "hello there 1";
  const char* str2 = "hello there 2";

  char buffer[MAX];

  concatStrings(concatStrings(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);
  printf("%s\n", buffer);

  exit(EXIT_SUCCESS);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C String