Сгруппировать несколько строк в одну в C - PullRequest
1 голос
/ 21 августа 2011

Я хочу создать переменную «полное имя» из нескольких строк. Примерно так:

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

Этот код повторяется в нескольких местах в моем проекте. Я собирался сделать функцию, которая делает именно это, но теперь мне интересно, нет ли лучшего способа сделать это.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Вы также можете сделать:

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

Но всегда убедитесь, что fullname указывает на буфер, который может вместить общую длину всех вещей, которые вы объединяете.

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);
1 голос
/ 21 августа 2011

Там stpcpy (стало стандартом в posix 2008).Это выглядело бы так:

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

Если вам также необходимо следить за тем, чтобы не переполнять полное имя, используйте вместо этого 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 также может быть хорошим выбором:1008 *

snprintf(fullname, sizeof(fullname), "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);
1 голос
/ 21 августа 2011
sprintf(fullname, "%s%s%s%s%s", firstname, separator, middlename, separator, lastname);

Если разделитель всегда " ", тогда вы можете сделать

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

Хотя вам нужно убедиться, что fullname имеет достаточно места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...