Verkettung von Strings in C
-
Verwenden Sie die Funktionen
strcat
undstrcpy
, um Zeichenketten in C zu verketten -
Verwendung von die Funktion
memccpy
zum Verketten von Zeichenketten in C - Verwendung der benutzerdefinierten Funktion zur Verkettung von String-Literalen 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);
}
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