自定义各种字符串函数 C 语言

strlen

字符串长度

计数器版


#include <stdio.h>
#include <assert.h>

#define MAX1 50


//size_t和unsigned int 是一样的,表示无符号整型,字符串长度不会是负数 
unsigned int my_strlen(const char* arr)
{
    assert(arr!=NULL);
    unsigned int count=0;
    while(*arr++!='\0')
    {
        count++;
    }
    return count;
}


int main()
{
    char arr[MAX1]="";
    printf("请输入你的字符串:\n");
    gets(arr);
    printf("字符串长度为:%d\n",my_strlen(arr));
    return 0;
 } 

递归版

指针-指针


strcpy

字符串拷贝


//模拟实现strcpy
//字符串的拷贝
//strcpy()有两个参数,目标空间的起始地址,原空间的起始地址

#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAX1 50
#define MAX2 50

char* my_strcpy(char* dest, const char* src)//const保证,src不会被修改,如果while判断条件写反了,会报错 
{
    //while (*src != '\0')
    //{
    //    *dest = *src;
    //    dest++;
    //    src++;
    //}//把src中‘\0’之前的元素全都放在dest中了,此时的*src中只剩下‘\0’了
    //
    // //还要把'\0'也放进去
    //*dest = *src;

    assert(dest != NULL);//断言,如果括号里的dest为NULL时,会自动报错,需引头文件#include <assert.h>,为假则报错 
    assert(src != NULL);
    char* ret=dest;//先保存下dest的起始地址 
    while (*dest++ = *src++)//当src到‘\0’时,\0的ASCII码值为0,等式为假,循环结束
    {
        ;
    }
    
    return ret;//返回目标空间dest的起始地址 
}


int main()
{
    char arr1[MAX1] = "";
    printf("请输入第一个字符串:\n");
    gets(arr1);
    char arr2[MAX2] = "";
    printf("请输入第二个字符串:\n");
    gets(arr2);
    /*strcpy(arr1, arr2);
    printf("%s\n", arr1);*/

    my_strcpy(arr1, arr2);
    printf("拷贝后的字符串内容为:\n");
    printf("%s\n", arr1);
    return 0;
}

strcat

字符串追加


#include <stdio.h>
#include <assert.h>

#define MAX1 50
#define MAX2 50

char* my_strcat(char * destination,const char* src)
{
    assert(destination&&src);
    char* ret=destination;//将destination的地址保存一下 
    //1、找到目标字符串的\0
    //2、把源数据追加上去,包含\0
    while(*destination)
    {
        destination++;
    } 
    //当*dest指向\0时,跳出while,此时,*dest指的就是\0
    //此时追加源字符串
    while(*destination++=*src++)//一个一个赋值,当*str指向\0时,跳出while 
    {
        ;
     } 
     
     return ret;
}


int main()
{
    char arr1[MAX1]="";
    printf("请输入第一个字符串:\n");
    gets(arr1);
    char arr2[MAX2]="";
    printf("请输入要追加的字符串:\n");
    gets(arr2);
    
    my_strcat(arr1,arr2);
    printf("追加后的字符串为:\n");
    printf("%s\n",arr1);
    return 0;
}

strcmp

字符串比较


#include <stdio.h>
#include <string.h>
#include <assert.h>

int my_strcmp(const char* s1,const char* s2)
{
    assert(s1&&s2);
    while(*s1==*s2)
    {
        if(*s1=='\0')//只有相等才能进while,所以当*s1='\0'时,代表*s2也等于'\0' 
        {
            return 0;
         } 
        s1++;
        s2++;
    }
    //当*s1和*s2不相等时,跳出循环,此时s1,s2指向的是那两个不相同的数,然后进入if语句 
//    if(*s1>*s2)
//    {
//        return 1;
//    }
//    else
//    {
//        return -1;
//    }
    //或者直接return *s1-*s2; 
    return *s1-*s2;
}


int main()
{
    char* p="abcdegh";
    char* q="dfgdfg";
    int ret=my_strcmp(p,q);
    printf("%d",ret);
    return 0;
}

strstr

判断是否是子串


#include <stdio.h>
#include <assert.h>


char* my_strstr(const char* str1,const char* str2)
{
    assert(str1&&str2);

    const char* s1=NULL;
    const char* s2=NULL;
    const char* cp=str1;
    
    while(*cp)
    {
        s1=cp;
        s2=str2;
        while(*s1&&*s2&&(*s1==*s2))
        {
            s1++;
            s2++;
        }
        if(*s2=='\0')
        {
            return (char*)cp;
        }
        cp++;
    }
    return NULL;
}


int main()
{
    char arr1[]="addfsdfdg";
    char arr2[]="fsdf";
    char* ret=my_strstr(arr1,arr2);
    if(ret==NULL)
    {
        printf("没找到\n");
    }
    else
    {
        printf("找到了:%s\n",ret);
    }
    return 0;
 } 

strtok

strerror

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼哥myg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值