A function that I use quite often in C is strcpy. The strcpy function allows the programmer to copy one string to another. This is beneficial if you want to parse or modify a string without affecting the original or if you want to store a string in a structure during processing. The function strcpy will automatically copy the null terminating byte within your string to the destination string, how handy is that! The goal of this article is to give you a few examples of using strcpy and a few things to avoid.
Function Definition Of strcpy
The strcpy function is quite basic and is defined as:
// Header Include
#include <string.h>
// Function definition
char *strcpy(char *dest, const char *src);
As you can see from the function definition the mapping is much like assigning a value to a variable, from right to left. In this case we must ensure our char *dest has enough space allocated to copy the source string to, otherwise strcpy will write into who knows what. It is also very important that our strings do not overlap in memory otherwise the validity of the strcpy execution cannot be trusted. I always err on the side of caution and allocate the space for my soon to be copied string with malloc. For an in-depth look at malloc refer to my malloc article. When allocating memory, remember to include space for the null terminating character as well.
Example Program Using strcpy
This quick example shows the use of strcpy and includes the strlen function and the use of malloc.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
char base_str[]="Erik was here.";
// Add the + 1 for the null terminator '\0'
char *cpy_str = (char *)malloc(strlen(base_str) + 1 * sizeof(char));
if(cpy_str == NULL){
fprintf(stderr, "Could not allocate memory for our strcpy.\n");
return -1;
}
strcpy(cpy_str,base_str);
fprintf(stdout,"Base str : -%s-\n", base_str);
fprintf(stdout,"Copied str : -%s-\n", cpy_str);
free(cpy_str);
return 0;
}
The output of this program is as expected:
$ ./copy
Base str : -Erik was here.-
Copied str : -Erik was here.-
In the example above I allocated the memory dynamically, if you know that the length of the string will be static than you can create your destination string statically as well. As a quick example:
char base_str="Erik was here.";
char dest_str[20];
// We could also use strlen for this static allocation
char dest_str_two[strlen(base_str) + 1];
strcpy(dest_str,base_str);
strcpy(dest_str_two,base_str);
The strcpy Gotchas
In conclusion, strcpy is very useful for copying strings for parsing or quick duplication of string data. There are a few things to remember:
- If the source and destination strings overlap the use of strcpy is undefined, and could be dangerous for your data.
- strcpy will copy the null terminating string, if you plan to allocate memory on the fly for the destination string remember to include space for the null terminator.
- Ensure the destination string is long enough to store the original string including the null terminator.
There you have it, strcpy explained!