Chcę utworzyć zmienną „pełna nazwa” z wielu ciągów. Coś takiego:

strcpy (fullname, firstname);
strcat (fullname, separator); // separator is initialized at " "
strcat (fullname, middlename);
strcat (fullname, separator);
strcat (fullname, lastname);

Ten kod powtarza się w wielu miejscach w moim projekcie. Chciałem zrobić funkcję, która dokładnie to robi, ale teraz zastanawiam się, czy nie ma lepszego sposobu na zrobienie tego.

Jakieś pomysły?

1
rahmu 21 sierpień 2011, 16:40
Pamiętaj, że nazwy mogą składać się z wielu słów
 – 
Romain Hippeau
21 sierpień 2011, 16:43
Czy to odpowiada na twoje pytanie? lepszy sposób łączenia wielu ciągów w c?
 – 
Richard Chambers
22 lipiec 2021, 01:58

3 odpowiedzi

Najlepsza odpowiedź

Możesz również zrobić:

sprintf (fullname, "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);

Ale zawsze upewnij się, że fullname wskazuje na bufor, który może pomieścić całkowitą długość wszystkich rzeczy, które łączysz.

int size;
int *fullname;
size = strlen (firstname) + strlen (separator) + strlen (middlename) + strlen (separator) + strlen (lastname) + 1;

fullname = malloc (sizeof (char) * size);

sprintf (fullname, "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);

/* Work */

free (fullname);
3
phoxis 21 sierpień 2011, 16:42
2
Snprintf zawiera argument rozmiaru i powinien być używany w przypadkach, gdy ciąg docelowy ma ustalony maksymalny rozmiar.
 – 
James O'Doherty
21 sierpień 2011, 17:03
sprintf(fullname, "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);

Jeśli separator to zawsze " ", możesz to zrobić

sprintf(fullname, "%s %s %s", firstname, middlename, lastname);

Musisz jednak upewnić się, że fullname ma wystarczającą ilość miejsca.

1
taskinoor 21 sierpień 2011, 16:45

Jest stpcpy (stał się standardem w posix 2008). Wyglądałoby to tak:

char *ptr = fullname:
ptr = stpcpy (ptr, firstname);
ptr = stpcpy (ptr, separator);
ptr = stpcpy (ptr, middlename);
ptr = stpcpy (ptr, separator);
ptr = stpcpy (ptr, lastname);

Jeśli musisz również uważać, aby nie przepełnić pełna nazwa, użyj zamiast tego stpncpy:

char *ptr = fullname;
char *end = fullname + sizeof(fullname) - 1;
ptr = stpncpy (ptr, firstname, end - ptr);
ptr = stpncpy (ptr, separator, end - ptr);
ptr = stpncpy (ptr, middlename, end - ptr);
ptr = stpncpy (ptr, separator, end - ptr);
ptr = stpncpy (ptr, lastname, end - ptr);
*ptr = '\0'; // Or optionally error if ptr >= end

Snprintf może być również dobrym wyborem:

snprintf(fullname, sizeof(fullname), "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);
1
Per Johansson 21 sierpień 2011, 17:05