模拟实现常见字符串函数

目录

  一、字符串函数

       strlen

      strcpy

     strcat

     strcmp

     

strlen

计算字符串长度的函数,遇见字符串中的\0停止,计算的是\0以前的字符个数,不包含\0,函数返回值是size_t,是无符号的

下面来模拟实现strlen函数

  const 修饰表示不可被修改,而assert断言则保证指针有效性

//计数的方式
int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}
//递归
int my_strlen1(const char* str)
{
	assert(str != NULL);//判断指针的有效性
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

   由于在主函数中传过来的不是\0,那么就会先加一,再递归下一个字符,直到遇到\0,

//指针-指针
int my_strlen2(const char* str)
{
	const char* start = str;
	assert(str != NULL);
	while (*str)
	{
		str++;
	}
	return str - start;//元素个数
}

strlen 是求字符串长度的,求出的长度是不可能为负数的所以返回类型设置为size_t 无符号类型是没有毛病的。

strcpy

   

.会将源字符拷贝到目标空间,源字符串必须以\0结束

.会将源字符串中的\0拷贝到目标空间

.目标也空间要足够大,且目标空间可变

下面来模拟实现strcpy

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//先将目标空间起始地址存着
	assert(dest && src);
	while (*dest++ = *src++)//将源字符串一个字符一个字符拷贝到目标空间,遇见src中的\0就不拷贝了
	{
		;
	}
	return ret;//拷贝结束返回目标空间起始地址
}

 注意程序中++是后置加加

strcat

  

函数原型和strcpy一摸一样

字符串追加函数strcat,同样有一下性质

。源字符以\0结束

。目标空间足够大

。目标空间可修改

模拟实现追加字符串

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;

	//1. 找目标空间的\0
	while (*dest)
	{
		dest++;
	}
	//2. 追加
	while (*dest++ = *src++)//和拷贝差不多
	{
		;
	}
	return ret;
}

int main()
{
	char arr[20] = "hello ";
	char arr2[] = "world";
	
	my_strcat(arr, srr2);

	printf("%s\n", arr);

	return 0;
}

 strcmp

函数原型两个字符串都是不可被修改

比较的是对应字符的ASCII值,不是字符串长度

模拟实现strcmp

int my_strcmp(const char* str1, const char* str2)//比较不改变字符串内容
{
	assert(str1 && str2);
	while (*str1 == *str2)//两个字符相同就往后走再判断是否遇见\0
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
//两个字符不相等时,再判断对应字符ASCII值
	/*if (*str1 > *str2)
		return 1;
	else
		return -1;*/
	return *str1 - *str2;//也可以直接返回它们相减结果
}


int main()
{
	char arr1[] = "abq";
	char arr2[] = "abcdef";
	
	int ret = my_strcmp(arr1, arr2);

	if (ret>0)
		printf("arr1>arr2\n");

	printf("%d\n", ret);

	return 0;
}

 好了,今天就模拟实现常见字符串函数

猜你喜欢

转载自blog.csdn.net/m0_67768006/article/details/129140281