strcpy函数
第一次代码:
#include
void my_strcpy(char* a1, char* a2)
{
while (*a2 != '\0')
{
*a1 = *a2;
a1++;
a2++;
}
*a1 = *a2;
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
第二次代码:
a1++、a2++ 可以在 *a1++ 和 *a2++
#include
void my_strcpy(char* a1, char* a2)
{
while (*a2 != '\0')
{
*a1++ = *a2++;
}
*a1 = *a2;
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
第三次代码:
将 *a1++ = *a2++ 写进 while循环的判断里,*a1 = *a2 可以省略
#include
void my_strcpy(char* a1, char* a2)
{
while (*a1++ = *a2++)
{
;
}
//*a1 = *a2;
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
第三次代码:
考虑 arr2 为空指针 NULL 的情况:对 arr2 arr1 进行判断
#include
void my_strcpy(char* a1, char* a2)
{
if (a1 != NULL && a2 != NULL)
{
while (*a1++ = *a2++)
{
;
}
}
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
第四次代码:
上面的方法只能规避空指针但不能很好的找到bug ,使用断言可以很好的找到问题
断言函数需要用到头文件 assert.h
assert 对指针进行判断,如果为空指针则程序会报错
#include
#include
void my_strcpy(char* a1, char* a2)
{
assert(a1 != NULL);
assert(a2 != NULL);
while (*a1++ = *a2++)
{
;
}
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
如果函数 my_strcy 函数的形式参数中有控制指针,则 assert 断言就会报错
第五次代码:
如果出现将 *a1 和 *a2 位置写反的情况,会出现可能不符合程序要求的错误
这里使用 const
#include
#include
void my_strcpy(char* a1, const char* a2)
{
assert(a1 != NULL);
assert(a2 != NULL);
while (*a1++ = *a2++)
{
;
}
}
int main()
{
char arr1[] = { "helloworld" };
char arr2[] = { "world" };
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
如果指针 *a2 被修改则程序会报错
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)