此题为字符串的复制函数,自己书写测试代码和strcpy函数如下,测试环境(Ubuntu):
#include
void strcpy(char *strDest, const char *strSrc);
int main()
{
char* str1 = "abc";
char* str2 = "bcd";
strcpy(str1, str2);
printf("str1 = %s, str2 = %s\n", str1, str2);
return 0;
}
void strcpy(char *strDest, const char *strSrc)
{
while ((*strDest++ = *strSrc++) != '\0');
}
测试结果报错:发生段错误,通过addr2line
定位到while ((*strDest++ = *strSrc++) != '\0');
这一行代码。
开始一直以为是这一行代码书写错误,将其分步改写,代码如下:
do
{
*strDest = *strSrc;
strDest++;
strSrc++;
} while (*strSrc != '\0');
然后调试,还是发生了段错误,继续使用addr2line
定位到*strDest = *strSrc;
这一行代码。然后将代码copy到vs2015上调式,打印错误信息:Unhandled exception thrown: write access violation
,即写访问冲突,因此怀疑是赋值时出现异常。仔细查看测试代码,发现定义的str1
为字符串字面量,其内存地址存储在只读存储区,不能作为左值使用。修改char str1[10] = "";
,然后测试后通过。具体代码如下:
#include
void strcpy(char *strDest, const char *strSrc);
int main()
{
char str1[10] = "";
char* str2 = "bcd";
strcpy(str1, str2);
printf("str1 = %s, str2 = %s\n", str1, str2);
return 0;
}
void strcpy(char *strDest, const char *strSrc)
{
while ((*strDest++ = *strSrc++) != '\0');
}
查看示例代码,完善strcpy
函数:
#include
#include
char* strcpy(char *strDest, const char *strSrc);
int main()
{
char str1[10] = "";
char str2[10] = "bcd";
printf("str = %s\n", strcpy(str1, str2));
return 0;
}
char* strcpy(char *strDest, const char *strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
char* addr = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return addr;
}