多种方式实现strcpy

Posted 凩子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多种方式实现strcpy相关的知识,希望对你有一定的参考价值。

多种方式实现strcpy

普通写法

#include<stdio.h>
void new_strcpy(char *arr1,char *arr2)

	while (*(arr2 - 1) != '\\0')
	
		*arr1 = *arr2;
		arr1++;
		arr2++;
	
	//或者
	while (*arr2 != '\\0')
	
		*arr1 = *arr2;
		arr1++;
		arr2++;
	
	*arr1 = *arr2;

int main()

	char arr1[20] = "ppppppppppp";
	char arr2[] = "hello world";
	new_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;

既然是后置++,那么我们可以直接将它与上面的代码合并。

void new_strcpy(char *arr1,char *arr2)

	while (*arr2 != '\\0')
		
			*arr1++ = *arr2++;
			//后置++的优先级虽比*高,但因会先使用后++,所以可以这样写。
		

更厉害的写法是下面这种

void new_strcpy(char *arr1,char *arr2)

	while (*arr1++ = *arr2++)//非0即为真,当arr2为‘\\0’时while循环也就停止了
		
			;
		

但上面的写法都有点缺陷,假设主函数不是直接传址,而是传的指针呢,且由于粗心未将地址赋给指针,直接以空指针的形式来传过去就会崩溃
比如

int main()

	char arr1[20] = "ppppppppppp";
	char arr2[] = "hello world";
	char* p=NULL;
	new_strcpy(arr1, p);
	printf("%s", arr1);
	return 0;


为避免上述情况,可以在new_strcpy中加入断言
assert() :当括号中表达式为真,什么都不会发生,程序正常运行,当表达式为假就会报错。(使用assert需要引头文件assert.h)

void new_strcpy(char *arr1,char *arr2)

    assert(arr1 != NULL);
    assert(arr2 != NULL);
	while (*arr1++ = *arr2++)
		
			;
		

在MSDN中可以看到strcpy其实是有返回值的

Return Value
Each of these functions returns the destination string. No return value is reserved to indicate an error.
其返回值是目标字符串的首地址

最后再拓展一下

int a=0;
int b=0;
int * p = &a;const*的左面(const int * p = &a或int const * p = &a),
则const修饰的是指针指向的内容,不能通过指针改变,但指针变量可以更改
(即以指针的形式无法修改a的值,但可以更改p的值)。

若const*的右面(int * const p=&a),则const修饰的是指针本身,
指针变量本身不能修改,指针指向的内容,可以通过指针改变,
(即以指针的形式可以修改a的值,但无法更改p的值)。

那么终版的strcpy就是下面的啦!!!

#include<stdio.h>
#include<assert.h>
char* new_strcpy(char *arr1,const char *arr2)//为防止在while循环那里arr1和arr2顺序写反,将arr设为const,即无法改变的常变量

    char* ret = arr1;
    assert(arr1 != NULL);
    assert(arr2 != NULL);
	while (*arr1++ = *arr2++)
		
			;
		
	return ret;

int main()

	char arr1[20] = "ppppppppppp";
	char arr2[] = "hello world";
	char *p=arr2;
	printf("%s\\n", new_strcpy(arr1, p));//通过利用strcpy的返回值是arr1的首地址进行链式访问
	return 0;

目标数组空间必须给足,否则会造成越界访问

以上是关于多种方式实现strcpy的主要内容,如果未能解决你的问题,请参考以下文章

多种方式实现strlen

Redis的多种持久化方式总结

多种方式实现AOP

android-多种方式实现主界面的Tab

IOC和AOP使用扩展 多种方式实现依赖注入

Python 列表嵌套多种实现方式