C语言:自己实现字符串相关的常用API

目录

gets(char *)

put(char *)

strlen(char *)

strcat(char *,char *);合并字符串

strcpy,strncpy

memset

实现strcmp(char ,char)比较字符串大小,若两字符串内容完全相同,返回0,若str1比str2长返回1,str1比str2短则返回-1,长度相同内容不同也返回-1

strstr


gets(char *)

1、
void myGets(char *str)
{
	while(1){
		*str = getchar();
		if(*str == '\n'){
			*str = '\0';
			return;
		}
		str++;
	}
}
2、
int mygets(char* p)
{
	int cnt=0;
	
	if(p==NULL)
	{
		printf("非法内存\n");
		
		return 0;
	}
	
	while(*p=getchar())
	{
		if(*p!='\n')
		{
			p++;
			cnt++;
		}
		else
		{
			*p = '\0';
			return cnt;
		}
	}
}

put(char *)

1、
void myput(char *str)
{
	while(*str!='\0')
	{
		printf("%c",*str++);
	
	}
	printf("\n");
	return;
}
2、
void myPuts(char *p)//*除了变量声明以外,其他都是运算符
{                   //字符串有明显的标志,都是以\0结尾

        while(*p != '\0'){
                putchar(*p++);
                //printf("%c",*p++);
        }
        putchar('\n');
}

strlen(char *)

int mystrlen(char *str)
{	
	int len=0;
    while(1)
    {
    		if(*str=='\0')
    		{
    		
    			return len;
			}
	    	str++;
	    	len++;
	}
	
}

strcat(char *,char *);合并字符串

void mystrcat(char *str1,char *str2)
{
	while(*str1!='\0')
	{
		str1++;
	}
	while(*str2!='\0')
	{
		*str1=*str2;
		str2++;
		str1++;
	}
	return;
 } 

strcpy,strncpy

char* myStrcpy(char* des,const char* source)
{
    if(des == NULL && source == NULL){
      return NULL;
    }   
  
     while(*source != '\0'){
          *des++ = *source++;         
     }
      *des = '\0';
      return des;
}

char* myStrncpy(char* des,const char* source,int n)
{
   
    if(des == NULL && source == NULL){
      return NULL;
    }   
  
     while(*source != '\0' && n>0){
          *des++ = *source++; 
          n--;        
     }
      *des = '\0';
      return des;
}

memset

void myMemset(char *p,char c,int num)
{       int i;
        /*if(*p++ != '\0'){
          	for(i=0;i<num;i++){
         	*p=c;       
         	}         
         }*/
        while(num){

                *p++=c;
                num--;
        }
}

实现strcmp(char ,char)比较字符串大小,若两字符串内容完全相同,返回0,若str1比str2长返回1,str1比str2短则返回-1,长度相同内容不同也返回-1

int mystrcmp(char *str1,char *str2)
{	
	int str1len=0;
	int str2len=0;
	while(*str1!='\0') 
	{
		str1++;
		str1len++;
	}
	while(*str2!='\0') 
	{
		str2++;
		str2len++;
	}
	if(str1len-str2len==0){
		for(int i=0;i<str1len;i++)
		{
			if(*str1==*str2){
				str1--;
				str2--;
			}
			else{
				return -1;
			}
		}
		return 0;
		
	}
	else if(str1len-str2len>0){
	return 1;
    }
    else {
    return -1;
	}
} 

strstr

#include <stdio.h>
#include <assert.h>
#include<string.h>
char* my_strstr(const char* p1, const char*p2)//参照strstr函数原型构建自己的strstr函数
{
	assert(p1 != NULL);//断言该指针不为空指针
	assert(p2 != NULL);
	char*s1 = NULL;//创建一个空指针;
	char*s2 = NULL;
	char*cur = p1;
	if (*p2 == '\0')
	{
		return (char*)p1;                    //如果我们所要找的子串p2为'\0',返回总串的首元素地址
	}

	while (*cur)//cur代表指向的是子串第一次出现的首元素地址
	{
		s1 = cur;                      //把cur指向字符串的首元素地址赋给s1
		s2 = (char*)p2;                    //把p2指向的首元素地址赋给s2,每一次循环都要从p2的首元素地址开始重新比较
		while ((*s1 != 0) && (*s2 != 0) && *s1 == *s2)           //只有在s1指向的首元素地址,s2指向的首元素地址都不为'\0'的时候,才可以在总串中找子串的首地址第一次出现的时候
		{                                            // 比较s1,s2指向的地址所对应的字符是否相等,若相等,各自指向的地址向后跳一个字节比较下一位是否相等在满足以上的条件下不断循环,若不满足,
			s1++;                                    //开始一下比较
			s2++;
		}
		if (*s2 == '\0')             //若经过上面的比较,s2指向的内容恰好是'\0',代表找到子串首次出现的地址
		{                              //若不满足以上情况的比较,开始以下比较
			return (char*)cur;
		}
		if (*s1 == '\0')  
		{
			return NULL;            //若在s2指向的内容不为'\0'时,s1指向的内容率先为0,代表总串长度比子串长度短,必不存在子串,返回一个空指针
		}
		cur++;//代表当前cur指向的并不是子串第一次出现的首元素地址,指向的地址要往后跳一个字节
	}

	return NULL;//如果经过以上比较都不能得出结果,代表找不到子串,要返回空指针

}

int main()
{
	const char* arr1 = "abbbcdefg";
	const char* arr2 = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
	{
		printf("找到了 子串为:%s\n", ret);
	}

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值