Как объединить 2 строки C, не перезаписывая никакие завершающие нулевые символы? - PullRequest
2 голосов
/ 14 июня 2010

Я пытаюсь настроить список имен файлов для параметра в SHFileOperation. Я хочу иметь возможность объединить имя файла в массив символов, но я не хочу избавиться от завершающего символа. например, я хочу это:
C: \ ... \ 0E: \ ... \ 0F: \ ... \ 0 \ 0

когда я использую strcat (), он перезаписывает ноль, поэтому выглядит как
C: \ ... E: \ ... F: \ ... 0 \

Есть ли простой способ сделать это? или я собираюсь написать новый strcat для себя?

Ответы [ 4 ]

1 голос
/ 14 июня 2010

Использовать memcpy.

memcpy(dest, src1, strlen(src1)+1);
memcpy(&dest[strlen(src1)+1], src2, strlen(src2)+1);
1 голос
/ 14 июня 2010

Код довольно прост.Используйте вспомогательный указатель, чтобы отслеживать, где должна начинаться следующая строка.Чтобы обновить указатель трекера, увеличьте на длину строки +1:

const char *data[] = { "a", "b", "c" };
size_t data_count = sizeof(data) / sizeof(*data);
size_t d;
size_t buffer_size;
char *buffer;
char *next;

// calculate the size of the buffer 
for (d = 0; d < data_count; ++d)
    buffer_size += (strlen(data[d] + 1);
buffer_size += 1;

buffer = malloc(buffer_size);

// Next will track where we write the next string
next = buffer;

for (d = 0; d < data_count; ++d)
{
    strcpy(next, data[d]);

    // Update next to point to the first character after the terminating NUL
    next += strlen(data[d]) + 1;
}
*next = '\0';
0 голосов
/ 15 июня 2010

просто используйте strcat для добавления к исходной строке, но добавьте единицу к смещению, чтобы обойти терминатор 0 предыдущей строки.

// an example

    char testString [256];

     strcpy (testString, "Test1");

     strcat (testString + strlen(testString)+1, "Test2");
     strcat (testString + strlen(testString)+1, "Test3");

testString теперь будет содержать «Test1 \ 0Test2 \ 0Test3 \ 0»

0 голосов
/ 15 июня 2010

Использование GNU stpcpy() может быть немного более элегантным, , если , вы заранее знаете максимальную «длину» полученного массива символов.

char *src[] = {"C:\\foo", "E:\\bar", "F:\\foobar", 0};
char dst[MY_MAX_LEN], *p = dst;
int i;

for (i = 0; src[i]; i++)
    p = stpcpy(p, src) + 1;
*p = 0;
assert(p < dst + sizeof dst);

При необходимости stpcpy () может быть определен как:

char *stpcpy(char * restrict dst, const char * restrict src)
{
    return strcpy(dst, src) + strlen(src);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...