strlen函数的模拟实现

strlen的模拟实现(求字符串长度)

字符串以’\0’作为结束标志,strlen函数返回的是字符串中‘\0’前面出现的字符的个数(不包含’\0‘).

size_t  strlen(const char* str)

计数器方法

在这里插入图片描述

//计数器方法模拟实现strlen--->计算字符串长度;
#include<stdio.h>
int my_strlen(char* str)//将字符串首地址传到函数
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
int main()
{

	char arr[] = "abcdef";
	int ret=my_strlen(arr);//将字符串首地址传到函数
	printf("%d", ret);

}

在这里插入图片描述

递归模拟实现strlen计算字符串长度

在这里插入图片描述

//用递归模拟实现strlen函数求字符串长度
int my_strlen(char* str1)
{
	if (*str1 == '\0')
		return 0;
	else
		return 1 + my_strlen(str1 + 1);
	
}
int main()
{

	char arr[] = "abcdef";
	int ret=my_strlen(arr);
	printf("%d", ret);

}

用指针- 指针的方式模拟实现strlen函数

在这里插入图片描述

int my_strlen(char* str)
{
	char* s = str;
	while (*str != '\0')//当str指针指向‘\0',跳出循环
	{
		str++;
	}
	return str - s;

}
int main()
{

	char arr[] = "abcdef";
	int ret=my_strlen(arr);
	printf("%d", ret);

}

strcpy的模拟实现

char* strcpy(char* destination,const char* source);
  • 源字符串必须以’\0‘结束
  • 会将源字符串中的’\0‘拷贝到目标空间;
  • 目标空间必须足够大,以确保能够存放字符串;
  • 目标空间必须可变。
#include<stdio.h>
#include<assert.h>//assert头文件
//src源字符串,dest目标空间
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;//将目标空间的首地址保存到ret
	assert(dest != NULL);//断言,如果是空指针,表明程序出错,会终止程序
	assert(src != NULL);
	/*while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src++;*/
	//利用后置++,先赋值,然后指针++,当为空时就会跳出循环
	while (( * dest++ = *src++))
	{
		;
	}
	
	return ret;
}
int main()
{
	//将数组arr1的内容拷贝到数组arr2中
	char arr1[] = "abcdef";
	char arr2[100] = { 0 };//初始化
	char* ret =my_strcpy(arr2, arr1);
	printf("%s", ret);//输出ret指向的字符串

}

模拟实现strcat函数

  • 给字符串追加字符串
  • 源字符串必须以’\0’结束
  • 目标空间足够大,能容纳下源字符串的内容
  • 目标空间必须可修改
char* stract(char* destination,const char* source)

在这里插入图片描述

#include<stdio.h>
#include<assert.h>//assert()函数的头文件
char* my_strcat(char* dest, const char* str)
{
    assert(dest && str);//断言,如果是空指针返回错误信息
    char* ret = dest;//把目标追加的首地址保存起来先
    //找到'\0'就停下来
    while (*dest != '\0')
    {
        dest++;
    }
    //追加字符串
    //*str不为空,就赋值给*dest
    while (*str)
    {
        *dest = *str;
        dest++;
        str++;
    }
    /*while(*dest++=*str++)
    {
         ;
    }
    */
    //返回目标函数首地址,打印字符串
    return ret;
}
int main()
{
    char arr1[40] = "hello";//要有\0,要足够大
    char arr2[20] = "tomato";//把字符串arr2追加到arr1
    char* ret=my_strcat(arr1, arr2);
   //也可以 char* ret = my_strcat(arr1, "tomato");
    printf("%s", ret);
    return 0;
}

模拟实现strcmp函数

作用:比较两个字符串的大小
一一对比,对比的字符ASCII码值的大小
返回值:

  • 第一个字符串大于第二个字符串,返回大于零的数字
  • 第二个字符串大于第一个字符串,返回小于零的数字
  • 第一个字符串等于第二个字符串,返回零。
    在这里插入图片描述
int strcmp(const char* str1 , const char* str2)//返回值int类型的
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{

    assert(str1 && str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        str1++;
        str2++;
    }//不相等就会跳出循环

    //str1小于str2返回小于零的数
    if (*str1 < *str2)
        return -1;
    //str1大于str2返回大于零的数
    else if (*str1 > *str2)
        return 1;
 //	//简化
//	return(*str1 - *str2);//如果str1大于str2的值,返回一个大于零的数
//						  //如果str1小于str2的值,返回一个小于0的值

}
int main()
{
    char arr1[40] = "hello";
    char arr2[20] = "tomato";
    int ret = my_strcmp(arr1, arr2);
    printf("%d", ret);
    
    return 0;
}

在这里插入图片描述

strncpy模拟实现—>拷贝n个函数到目标函数

函数声明

char *strncpy(char *dest, const char *src, size_t n)

从源字符串拷贝n个字符到目标空间
如果源字符串的长度小于n,那么拷贝完源字符串以后,在后面追加零,直到n个为止,即目标函数剩余部分用空字节填充
注意,在使用strnpy函数时,不会自动添加终止符,需要自己加上终止符(‘\0’)
或者在函数初始化的时候,将目标函数里面都填充上’\0’
比如用memset()函数–>复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符(将前n个字符覆盖为字符c)

//void *memset(void *str, int c, size_t n)
int main()
{
    char arr[40] = { 0 };
    char str[] = "hello man!";
    memset(arr, '\0', sizeof(arr));//填充‘\0’
    strncpy(arr, str, 5);
    printf("%s\n", arr);
    return 0;
}
#include<stdio.h>
//strncpy()模拟实现
char* my_strncpy(char* dest, char* src, size_t n)
{
    int i = 0;
    char* ret = dest;//将目标字符串的首地址保存下来。
    for (i = 0; i < n; i++)
    {
        *dest = *src;
        dest++;
        src++;
    }
   // *dest = '\0';//要加上‘\0',
    //拷贝的时候并没有把\0拷贝过去,没有'\0'会出问题
    return  ret;
}
int main()
{
    char arr[40] = { 0 };
    char str[] = "hello man!";
    char* ret=my_strncpy(arr, str, 7);
    printf("%s\n", ret);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值