How to copy a char array in C?
In C, I have two char arrays:
char array1[18] = "abcdefg";
char array2[18];
How to copy the value of array1
to array2
? Can I just do this: array2 = array1
?
Solution 1:
You can't directly do array2 = array1
, because in this case you manipulate the addresses of the arrays (char *
) and not of their inner values (char
).
What you, conceptually, want is to do is iterate through all the chars of your source (array1) and copy them to the destination (array2). There are several ways to do this. For example you could write a simple for loop, or use memcpy
.
That being said, the recommended way for strings is to use strncpy
. It prevents common errors resulting in, for example, buffer overflows (which is especially dangerous if array1
is filled from user input: keyboard, network, etc). Like so:
// Will copy 18 characters from array1 to array2
strncpy(array2, array1, 18);
As @Prof. Falken mentioned in a comment, strncpy
can be evil. Make sure your target buffer is big enough to contain the source buffer (including the \0
at the end of the string).
Solution 2:
If your arrays are not string arrays, use:
memcpy(array2, array1, sizeof(array2));
Solution 3:
If you want to guard against non-terminated strings, which can cause all sorts of problems, copy your string like this:
char array1[18] = {"abcdefg"};
char array2[18];
size_t destination_size = sizeof (array2);
strncpy(array2, array1, destination_size);
array2[destination_size - 1] = '\0';
That last line is actually important, because strncpy()
does not always null terminate strings. (If the destination buffer is too small to contain the whole source string, sntrcpy() will not null terminate the destination string.)
The manpage for strncpy() even states "Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated."
The reason strncpy() behaves this somewhat odd way, is because it was not actually originally intended as a safe way to copy strings.
Another way is to use snprintf() as a safe replacement for strcpy():
snprintf(array2, destination_size, "%s", array1);
(Thanks jxh for the tip.)