Stringhe concatenate in C
-
Usa le funzioni
strcat
estrcpy
per concatenare le stringhe in C -
Usa la funzione
memccpy
per concatenare le stringhe in C - Utilizzare la funzione definita personalizzata per concatenare valori letterali stringa in C
Questo articolo spiegherà diversi metodi su come concatenare le stringhe in C.
Usa le funzioni strcat
e strcpy
per concatenare le stringhe in C
strcat
fa parte delle strutture per le stringhe della libreria standard C definite nell’intestazione <string.h>
. La funzione accetta due argomenti char*
e aggiunge la stringa memorizzata nel secondo puntatore a quella nel primo puntatore. Poiché le stringhe in stile C terminano con il carattere \0
, strcat
inizia ad aggiungersi alla stringa di destinazione a partire dal carattere nullo. Infine, la fine di una stringa appena costruita termina con il carattere \0
. Si noti che il programmatore è responsabile dell’allocazione della memoria sufficiente nel puntatore di destinazione per memorizzare entrambe le stringhe.
La seconda funzione da utilizzare in questa soluzione è strcpy
, che allo stesso modo accetta due parametri char*
e copia la stringa dal secondo puntatore al primo puntatore. Notare che strcpy
è usato per copiare la prima stringa nel buffer char*
designato e poi passare il puntatore di destinazione alla funzione strcat
.
Entrambe le funzioni restituiscono il puntatore alla stringa di destinazione e ciò rende possibili le chiamate concatenate.
#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);
}
Produzione:
hello there 1hello there 2
Hello there, Josh!
Temporary...
Usa la funzione memccpy
per concatenare le stringhe in C
Il principale svantaggio del metodo precedente è la sua implementazione inefficiente che esegue iterazioni ridondanti sulla prima stringa memorizzata dalla funzione strcpy
.
memccpy
, d’altra parte, corregge questo problema ed elabora entrambe le stringhe in modo efficiente. memccpy
copia non più del numero di byte specificato dall’utente dalla sorgente char*
al puntatore di destinazione fermandosi solo quando il carattere dato viene trovato nella stringa sorgente. memccpy
restituisce il puntatore all’ultimo carattere memorizzato nel buffer di destinazione. Quindi, due chiamate memccpy
possono essere concatenate in modo simile al metodo precedente. La prima stringa viene copiata nel buffer preallocato dall’utente, e la seconda stringa viene aggiunta al puntatore restituito dalla prima chiamata a 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);
}
Produzione:
hello there 1hello there 2
Utilizzare la funzione definita personalizzata per concatenare valori letterali stringa in C
In alternativa, se memccpy
non è disponibile sulla tua piattaforma, puoi definire una funzione personalizzata che implementa la stessa routine. concatStrings
è l’implementazione di esempio che copia i caratteri da un puntatore a un altro finché non viene trovato il carattere specificato. Nota che specifichiamo il byte nullo \0
come carattere su cui fermarsi in entrambi gli esempi.
#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