字符串函数基础加中等了解

目录

一:简单易实现的函数

 strstr子串查找

strstrBF算法实现

strtok切片函数

strtok实现


一:简单易实现的函数

1.sizeof 2.strlen 3.strcmp 4.strcat 5.strcpy 6.strncmp 7.strncat 8.strncpy

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<stdio.h>
int main()
{
	char a[20] = "abc";//自动补\0
	char b[] = {'a','b','c'};//不会补\0
	char c[20] = "def";
	printf("a的大小=%d,b的大小=%d\n", sizeof(a), sizeof(b));//a b在这里是整个数组非首地址
	//a的大小 = 4,b的大小 = 3

	printf("a的长度=%d ,b的长度=%d\n", strlen(a), strlen(b));//strlen在计算是遇到\0截至
	//a的长度 = 3 ,b的长度 = 15(随机值)

	printf("%d\n", strcmp(a, b));//strcmp默认返回值为1 0 -1
	//-1

	printf("%s\n", strcat(a, c));//strcat 是在目标字符串尾部追加字符串(\0是判断停止的关键词)
	//a数组为abcdef
	
	printf("%s\n", strcpy(c, a));//strcpy 是覆盖原字符串把新的字符串从头复制
	// c 从def被复制为abcdef
	//*********************************以上的都是字符串的整体操作***************************
	//*********************************下面介绍一些字符串规定长度的函数*********************

	printf("%d\n", strncmp(a, b,3));//strncmp默认返回值为1 0 -1 不同的是第三个参数是两个字符串比较的长度
	//0

	printf("%s\n", strncat(a, c,1));//strncat 是在目标字符串尾部追加字符串第三个参数规定了字符的追加个数
	//a数组为abcdefa

	printf("%s", strncpy(c, a,1));//strncpy 是覆盖原字符串把新的字符串从头复制第三个参数规定了覆盖的个数
	// c 从abcdef被复制为abcdef  原因是a和c原本都是abcdef
	//***************************字符串的普通函数介绍完毕************************************
	//原理简单可自行实现
	return 0;
}

 strstr子串查找

int main()
{
	char a[10] = "abcdef";
	char b[10] = "def";
	printf("%s", strstr(a, b));//strstr是如果目标子串存在于主串会返回一个指针(主串子串的起始指针),%s会打印主串周从于子串开始到结束的字符
	//def
	return 0;
}

strstrBF算法实现

//BF算法实现strstr
char* my_strstr(const char* a, const char* b)
{
	assert(a, b);
	char* p = a;//记录主串开始的字符位置
	char* s1 = a;
	char* s2 = b;
	while (*p)
	{
		s1 = p;
		s2 = b;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		p++;

	}
	return NULL;
}

strtok切片函数

int main()
{
	char a[] = "2542447657@qq.com";
	char b[] = "@.";
	char* tok = 1;
	for (tok = strtok(a, b); tok != NULL; tok = strtok(NULL, b))
	{
		printf("%s\n", tok);
	}
	//2542447657
	//qq
	//com

	return 0;
}

strtok实现

char* my_strtok(char* a, const char* b)
{
    static char* src = NULL;  //记下上一次非分隔字符串字符的位置
    const char* inb = b;//for 的时候可以重新找到delim的初始位置
    int flag = 1, index = 0;

    //每一次调用strtok,flag标记都会使得程序只记录下第一个非分隔符的位置,以后出现非分隔符不再处理

    char* temp = NULL;                                       //程序的返回值

    if (a == NULL)
    {
        a = src;                                               //若str为NULL则表示该程序继续处理上一次余下的字符串
    }
    for (; *a; a++)
    {
        b = inb;
        for (; *b; b++)
        {
            if (*a == *b)
            {
                *a = NULL;                    //若找到delim中断句的字符,将该字符置为NULL
                index = 1;                         //用来标记已出现断句字符
                break;
            }
        }
        if (*a != NULL && flag == 1)
        {
            temp = a;                              //只记录下当前第一个非断句字符的位置
            flag = 0;
        }
        if (*a != NULL && flag == 0 && index == 1)
        {
            src = a;                                   //第二次出现非断句字符的位置(之前一定出现过断句字符)
            return temp;
        }
    }
    src = a;

 

    return temp;
}

  • 41
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 39
    评论
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编程菜鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值