4.5.3 复制以空字符结尾的字符串
标准库函数strcpy()将字符串从源位置复制到目标位置。第一个参数是指向目标位置的指针,第二个参数是指向源字符串的指针;两个参数类型均为char*。该函数返回一个指向目标字符串的指针。下面是它的一个用法示例:
- const size_t LENGTH = 22;
- const char source[LENGTH] ="The more the merrier!";
- char destination[LENGTH];
- cout << "The destination string is: "
<< strcpy(destination, source) << endl;
source字符串和destination缓冲区都能容纳一个包含21个字符加上结尾空字符的字符串。在最后一个语句中,我们将source字符串复制到destination中。输出语句利用了strcpy()函数返回一个指向目标字符串的指针这一事实,因此输出为:
- The destination string is: The more the merrier!
我们必须确保目标字符串有足够的空间容纳源字符串。如果空间不够,内存中有些字符就可能会被重写,从而导致灾难性的结果。
strcpy_s()函数是strcpy()的一个更安全的版本。它要求在目标参数与源参数之间用一个额外的参数来指定目标字符串缓冲区的大小。strcpy_s()函数返回一个errno_t类型的整数值来指示有没有发生错误。下面是使用该函数的示例:
- const size_t LENGTH = 22;
- const char source[LENGTH] ="The more the merrier!";
- char destination[LENGTH];
-
- errno_t error = strcpy_s(destination, length, source);
-
- if(error == EINVAL)
- cout << "Error. The source or the destination is NULL." << endl;
- else if(error == ERANGE)
- cout << "Error. The destination is too small." << endl;
- else
- cout << "The destination string is: " << destination << endl;
对于本例,我们需要包括<cstring>和<cerrno>头文件才能编译。strcpy_s()函数确认源字符串和目标字符串都不是NULL,且目标缓冲区有足够的空间容纳源字符串。当源字符串和目标字符串两者之一为NULL时或者两者都为NULL时,函数就会返回值EINVAL。如果目标缓冲区太小,函数就会返回ERANGE。如果复制成功,则返回值为0。
这些复制函数也有类似的宽字符版本:分别是wcscpy()和wcscpy_s()。