Verkettung von Strings in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktionen strcat und strcpy, um Zeichenketten in C zu verketten
  2. Verwendung von die Funktion memccpy zum Verketten von Zeichenketten in C
  3. Verwendung der benutzerdefinierten Funktion zur Verkettung von String-Literalen in C
Verkettung von Strings in C

In diesem Artikel werden verschiedene Methoden zur Verkettung von Zeichenketten in C erklärt.

Verwenden Sie die Funktionen strcat und strcpy, um Zeichenketten in C zu verketten

Die Funktion strcat ist Teil der String-Funktionen der C-Standardbibliothek, die im Header <string.h> definiert sind. Die Funktion nimmt zwei char*-Argumente entgegen und hängt die am zweiten Zeiger gespeicherte Zeichenkette an die am ersten Zeiger befindliche an. Da die Strings im C-Stil mit dem Zeichen \0 enden, beginnt strcat mit dem Anhängen an den Zielstring ab dem Null-Zeichen. Schließlich wird das Ende einer neu konstruierten Zeichenkette mit dem \0-Zeichen abgeschlossen. Beachten Sie, dass der Programmierer dafür verantwortlich ist, dass der Speicher am Zielzeiger groß genug ist, um beide Zeichenketten zu speichern.

Die zweite Funktion, die in dieser Lösung verwendet wird, ist strcpy, die ebenfalls zwei char*-Parameter entgegennimmt und die Zeichenkette am zweiten Zeiger in den ersten Zeiger kopiert. Beachten Sie, dass strcpy verwendet wird, um die erste Zeichenkette in den vorgesehenen char-Puffer zu kopieren und dann den Zielzeiger an die Funktion strcat zu übergeben.

Beide Funktionen geben den Zeiger auf die Zielzeichenkette zurück, und das macht die Verkettungsaufrufe möglich.

#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);
}

Ausgabe:

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

Verwendung von die Funktion memccpy zum Verketten von Zeichenketten in C

Der größte Nachteil der bisherigen Methode ist die ineffiziente Implementierung, die redundante Iterationen über die erste von der Funktion strcpy gespeicherte Zeichenkette durchführt.

memccpy hingegen korrigiert dieses Problem und verarbeitet beide Zeichenketten effizient. memccpy kopiert nicht mehr als die vom Benutzer angegebene Anzahl von Bytes von der Quelle char* zum Zielzeiger und hält erst an, wenn das angegebene Zeichen in der Quellzeichenkette gefunden wird. memccpy gibt den Zeiger auf das letzte gespeicherte Zeichen im Zielpuffer zurück. So können zwei memccpy-Aufrufe ähnlich wie bei der vorherigen Methode verkettet werden. Die erste Zeichenkette wird vom Benutzer in den vorbereiteten Puffer kopiert, und die zweite Zeichenkette wird an den Zeiger angehängt, der vom ersten Aufruf von memccpy zurückgegeben wird.

#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);
}

Ausgabe:

hello there 1hello there 2

Verwendung der benutzerdefinierten Funktion zur Verkettung von String-Literalen in C

Wenn memccpy auf Ihrer Plattform nicht verfügbar ist, können Sie alternativ eine benutzerdefinierte Funktion definieren, die die gleiche Routine implementiert. Die Beispielimplementierung concatStrings kopiert die einzelnen Zeichen von einem Zeiger zu einem anderen, bis das angegebene Zeichen gefunden wird. Beachten Sie, dass wir in beiden Beispielen das Null-Byte \0 als das Zeichen angeben, bei dem angehalten werden soll.

#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);
}
Autor: 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

Verwandter Artikel - C String