自己实现strcpy和strlen函数

大家可能会遇到这样的题目,不使用C语言库函数来实现拷贝字符串和求字符串长度的功能。本文就是来详细地说明如何模拟实现这两个函数的功能。


 strcpy部分

函数的参数形式char* strcpy(char*destination,const char*source);

该参数说明了strcpy返回类型是char类型的指针,将源头(不能被改)拷贝到目的地。

strcpy特点和strlen类似,遇到‘\0’就停止。

比较容易想到的写法是:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcpy(char* a, char* b)
{
	while (*a != '\0')
	{
		*b = *a;
		b++;
		a++;
	}
	*b = *a;
}
int main()
{
	char a[] = "abcdef";
	char b[10];
	my_strcpy(a, b);
	printf("%s", b);
	return 0;
}

虽然可以实现strcpy函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
void my_strcpy(char a[],char b[])
{
    assert(a!=NULL&&b!=NULL);//断言函数来避免空指针的情况
	while (*b++ = *a++)
	{
		;//当*a为\0的时候,while里的值为假,跳出循环
	}
}
int main()
{
	char a[] = "abcdef";
	char b[10]="";//定义第二个数组来拷贝数组
	my_strcpy(a,b);
	printf("%s", b);
	return 0;
}

strlen部分

函数的参数形式 size_t  strlen(const char* str);

size_t表示的是无符号数,const放的位置表示*str所指向的内容不可以被改变。

strlen函数的特点是遇到’\0’就停止了,且只能用来求字符的长度

比较容易想出来的方法如下所示:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char str[])
{
	int count = 0;
	assert(str != NULL);//这里使用assert断言函数来防止空指针的情况
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char str[10] = "abcdef";
	printf("%d",my_strlen(str));
	return 0;
}

 虽然可以实现strlen函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int my_strlen(const char a[])//用const来使代码更加安全
{
	int count = 0;
	while (* a++ != '\0')
	{
		count++;
	}
	return count;
}
int main()
{
	char a[]="abcdef";
	int b = my_strlen(a);
	printf("%d", b);
	return 0;
}

在这里深入讲解一下strlen函数。上面已经提到函数的参数形式 size_t  strlen(const char* str);

而size_t表示的是无符号数,必定是正数。

strlen返回值类型是无符号数,所以strlen("字符串")-strlen("字符串")必是大于0的数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	size_t count = strlen("chen") - strlen("chendadachen");//得到的结果一定大于0
	printf("count=%u", count);//打印%u时,因为是无符号,所以必定为正数,而正数原码补码相同,打印的是补码。
	return 0;
}


如果大家发现代码讲解有问题的话,请一定要不吝赐教告诉我!

猜你喜欢

转载自blog.csdn.net/weixin_73534885/article/details/129024016
今日推荐