Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Concatenate 2 C strings, without overwriting any terminating Null characters?

Tags:

c

string

I am trying to set up a list of file names for a parameter to SHFileOperation. I want to be able to concatenate a file name onto the char array, but i dont want to get rid of the terminating character. for example, I want this:
C:\...\0E:\...\0F:\...\0\0

when i use strcat(), it overwrites the null, so it looks like
C:\...E:\...F:\...0\

Is there any easy way to do this? or am i going to have to code a new strcat for myself?

like image 580
Ben313 Avatar asked Dec 15 '25 11:12

Ben313


2 Answers

The code is pretty straightforward. Use a helper pointer to track where the next string should start. To update the tracker pointer, increment by the length of the string +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';
like image 196
R Samuel Klatchko Avatar answered Dec 17 '25 00:12

R Samuel Klatchko


Use memcpy.

memcpy(dest, src1, strlen(src1)+1);
memcpy(&dest[strlen(src1)+1], src2, strlen(src2)+1);
like image 41
Robert Avatar answered Dec 17 '25 00:12

Robert



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!