功能:实现字符串的复制
结构:char*strcpy(char*destination,const char*source)
复制字符串,将源指向的字符串复制到目标指向的组中,包括终止的null字符eg:'\0'(并在该点停止)
#include
#include
int main()
{
char str1[] = "Sample string";
char str2[40];
char str3[40];
printf("%s\n", str2);
strcpy_s(str2, str1);
strcpy_s(str3, "copy successful");
printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3);
return 0;
}
并且此时要注意:为了防止溢出,未确定大小的destination数组要确保足够大,能够完全接收源字符串的内容,且包括终止字符('\0')!
(1)利用数组方式:
void my_strcpy(char* str1, char* str2)
{
int i = 0;
while (str2[i] != '\0')
{
str1[i] = str2[i];
i++;
}
str1[i] = '\0';
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
my_strcpy(str1, str2);
printf("%s\n", str1);
}
(2)利用指针形式:
void my_strcpy(char* str1, char* str2)
{
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
my_strcpy(str1, str2);
printf("%s\n", str1);
}
继续进行优化:优化1:
void my_strcpy(char* str1, char* str2)
{
while(*str2!='\0')
{
*str1++ = *str2++;
}
*str1 = *str2;
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
my_strcpy(str1, str2);
printf("%s\n", str1);
}
优化2:
void my_strcpy(char* str1, char* str2)
{
while (*str1++ = *str2++)
{
;
}
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
my_strcpy(str1, str2);
printf("%s\n", str1);
}
此时while实现的条件是:*str1++=*str2++;该表达式的结果为:=左右两边的值,比如为:str2[0]=h
那么此时既将str2里面的内容赋给str1里面的内容,又可以利用while循环判断真假,在需要的位置将循环终止!代码进行了简化!
解决问题1:因为strcpy函数的返回值为char*类型的,那么可以返回destionation的起始地址即可;并且由于此时模拟函数已有返回值,再int主函数内,就不需要再进行打印str1了,直接打印模拟函数my_strcpy的返回值即可(链式访问)
char*my_strcpy(char*str1,char*str2);
printf("%s\n",my_strcpy(str1,str2);
解决问题2:如下代码所示:
void my_strcpy(char* str1, char* str2)
{
while (*str2++ = *str1++)
{
;
}
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
my_strcpy(str1, str2);
printf("%s\n", str1);
}
while()内的内容,在书写代码的过程中可能把str2与str1的位置进行颠倒;但是此时程序依然会继续运行,由于数组大小问题会报错,但是如图所示str1的内容仍然赋给了str2;
那么为了防止以上内容的出现,我们就需要对str2内的内容进行保护,防止程序对其进行修改!
void my_strcpy(char*str1,const char*str2);
如上代码所示,加上const之后,str2里面的内容就不可以再被修改,那么如果再出现以上情景:
如图所示,程序此时就会自动报错,所以很容易发现该错误;
解决问题3:利用assert函数断言!
首先简单了解assert();当括号内的条件为真,那么则继续执行下面的程序;当括号内的条件为假时,报错,之后的程序也遍不能继续正常进行!
那么为了防止*destionation或者*source为空指针,那么再while循环开始之前就进行断言,即在while循环之前加上两个assert断言;
#include//assert()的头文件
assert(str1 !=NULL);
assert(str2 !=NULL);
那么经过以上优化,最终的代码就为:
#include
char* my_strcpy(char* str1,const char* str2)
{
assert(str2 != NULL);
assert(str1 != NULL);
char* ret = str1;
while (*str1++ = *str2++)
{
;
}
return ret;
}
int main()
{
char str1[] = "xxxxxxxxxxxxxxxx";
char str2[] = "hello";
//my_strcpy(str1, str2);
printf("%s\n", my_strcpy(str1,str2));
}