#include <iostream>
#include <assert.h>
using namespace std;
char* Mystrcpy(char* dest, const char* src)//src加const保护
{
assert((dest != NULL) && (src != NULL));//assert断言,保证dest,src不为空
char* address = dest; //记录dest的起始位置作为返回值
while ((*dest++=*src++)!='\0') //把src中的字符一个一个的复制给dest(包括src中的'\0'),当*src==‘\0’时,停止;
{
;
}
return address; //返回char*的指针
}
int main()
{
char s2[20];
cout << "ret=" << Mystrcpy(s2, "abcdefghi") << endl;
return 0;
}
//测试题1
void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy(string, str1);//错误:strcpy函数的实现,把源字符串中的'\0'也会拷贝到目标字符串中,但是string字符串中只有10个字符大小的空间,而*str1的大小为11,所以会越界。
}
//测试题2
void test2()
{
char string[10], str1[10];
int i;
for (i = 0; i < 10; i++)
{
str1[i] = 'a';
} //for循环将str1中的10个字符空间全部赋值为'a'
strcpy(string, str1);//由于str1中没有'\0',所以复制字符的个数不确定,也存在越界为题
}
//测试题3
void test3(char* str1)
{
char string[10];
if (strlen(str1) <= 10)//strlen计算字符串长度不包括'\0',所以应该 if(strlen(str1) < 10)
{
strcpy(string, str1);
}
}
下半部分是关于strcpy()函数的纠错题,主要是在:
1.strcpy()函数拷贝会将'\0'也拷贝到目标字符串中,
2.strcpy()函数拷贝时碰到源字符串中的第一个'\0'后,结束拷贝
3.strlen()函数计算字符串长度时,不包括'\0'
只要了解了strcpy()函数的实现原理和使用注意事项就可以很好的使用strcpy()函数