There is a difference between a simple assignment and str_cpy.
When you use str_cpy you have to ensure that both parameters passed to the function point to a valid string. str_cpy just copies the content of strings. So if you want to copy a string to a string of a struct you have to first initialize it with str_create.
yourstruct.string = str_create("#12");
str_cpy(yourstruct.string,"Hello World");
If you just use the assingment operator something different is done. You then assign the pointer the memory area of the string. This is a huge difference. Once you free the string (for what ever reasons) all pointers pointing to that string will immediately become invalid.
You have to choose what version fits your needs better.