目录
一:简单易实现的函数
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;
}