string.h中一些库函数的模拟实现(strlen,strcpy,strcmp,strcat,strstr),strtok,strerror,字符分类函数的介绍

摘要:模拟实现string.h中的一些库函数,主要包括:strlen,strcpy,strcmp,strcat,strstr以及strtok,strerror,字符分类函数等介绍

具体的官方函数可参考网址:https://cplusplus.com/

目录

具体的官方函数可参考网址:https://cplusplus.com/

        1.模拟实现strlen:计算字符串长度

2.模拟实现strcpy

3.模拟实现strcmp:比较两个字符串的大小,规定:

4.模拟实现strcat

        5.模拟实现strstr

        6.strtok

        7.strerror

        8.字符分类函数

总结


1.模拟实现strlen:计算字符串长度

有三种方法:

1.1.使用count计数器

int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}

1.2.使用两个指针start,end

int my_strlen(const char* str)
{
	assert(str);
	char* start = str;
	char* end = str;
	while (*end)
	{
		end++;
	}
	return end - start;  //两个指针相减为之间的字符个数
}

1.3.递归的方法

int my_strlen(char* str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
		return 1 + my_strlen(str+1);
}

2.模拟实现strcpy:将字符串2的地址拷贝到字符串1的地址,返回1的地址

  • src必须以'\0'结束
  • 会将src中的'\0'拷贝到dest
  • dest必须足够大,能够放入src
  • dest必须可变,不要使用常量字符串

代码的模拟实现:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest); //保证指针的有效性
	assert(src);
	char* tmp = dest;
	
	while (*dest++ = *src++)
	{
		;
	}
 	return tmp;
}

3.模拟实现strcmp:比较两个字符串的大小,规定:

  • str1大于str2,返回>0
  • str1等于str2,返回0
  • str1小于str2,返回<0

判断两个字符串是否相等:单个字节的ascii码进行比较

int my_strcmp(const char* str1,const char* str2)
{
    //先判断两个指针的有效性
	assert(*str1);
	assert(*str2);
    
    //两个相等,指针向后移动,直到不相等,返回*str1-*str2
    //两个相等,判断一个是否到\0,则两个全等,返回0
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
		//单个字节比较
		
		/*if (*str1 > *str2)
		{
			return *str1 - *str2;
		}
		else 
		{
			return *str1 - *str2;
		}*/
	return *str1 - *str2;
	}

4.模拟实现strcat:在dest后面拼接src,返回拼接后的dest

char * strcat ( char * destination, const char * source );

模拟实现思路:首先找到dest的\0,然后再拼接

  • 源字符串必须以\0结束
  • dest空间必须足够大,能容纳src中的字符
  • dest必须可以修改

char* my_strcat(char * dest,char * src)
{
	char* cur = dest;
	//先让cur指针找到dest的\0位置
	while (*cur)
	{
		cur++;
	}
	//拷贝源头数据到\0之后的空间
	while (*cur++ = *src++)
	{
		;
	}
	return dest;
}

5.模拟实现strstr:在str1中寻找str2是否存在,如果存在返回str2的地址,不存在返回NULL

char * strstr ( const char * str1 , const char * str2 );

模拟实现思路:使用两个指针s1,s2分别指向str1,str2;此时需要一个指针p来记录str2在str1中找到的位置,即找到之后返回p的地址;首先:将p指向str1,比较*s1与*s2,如果相等,s1++,s2++,此时p不动;如果不相等,则p++,s1跟着p++,循环这个步骤,直到遍历完str1

char* my_strstr(const char * str1,const char * str2)
{
    //先对两个指针断言
    assert(*str1);
    assert(*str2);
    
    //三个指针
    char * s1 = str1;
    char * s2 = str2;
    char * p  = str1; 

    while(*p)
    {
        s1 = p;
        while(*s1!='\0' && *s2!='\0' && (*s1 == *s2))
            {
                s1++;
                s2++;
            }
        //s2遍历结束,则找到了
        if(*s2 =='\0')
            return (char *)p;
        p++;
    }
    //*p走到尽头,即str1遍历结束,表示没找到
    return NULL;
}

6.strtok

char * strtok ( char * str , const char * sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。
  • 使用指南:
    /* strtok example */
    
    int main()
    {
     char *p = "www@sust.com";
     const char* sep = ".@";
     char arr[30];
     char *str = NULL;
     strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
     for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
     {
     printf("%s\n", str);
        //www
        //sust
        //com
     }
    }

7.strerror

char * strerror ( int errnum );

返回错误码对应的信息,使用的时候 必须包含errno.h

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{

  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    //errno: Last error number
  return 0;
}

总结

以上为本文的主要内容,技术有限,若有错误,欢迎指正。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值