目录
(1)、什么是strstr?(strstr = string + string)
一、strlen函数
顾名思义:计算字符串长度 ( strlen = string + lenth )
(1)、strlen如何使用?
注意:
1、strlen遇到‘\0’才停止 ,计算结果不包括‘\0’
2、返回值是size_t(无符号整型)
//定义一个字符串
char arr[5] = "abcd";
//调用strlen函数
int size = strlen(arr); //直接计算该字符串长度
//打印
printf("%d ", size);
解释:strlen直接计算字符串长度
1、定义一个字符串
2、调用strlen函数,返回值用int接收
3、打印看结果
(2)、strlen的三种模拟实现(递归、指针、计数器)
1、strlen模拟实现(递归)
先看代码:
#include<stdio.h>
#include<string.h>
int Mystrlen(char* arr)
{
//利用迭代实现strlen
if (*arr++) //解引用,不是'\0'就++
{
return 1 + Mystrlen3(arr); //通过不断调用自身
}
else
{
return 0;
}
}
int main()
{
char arr[5] = "abcd"; //定义一个字符串
int ret = Mystrlen(arr); //调用函数
printf("%d ", ret);
return 0;
}
递归:通过不断调用自身,再跟if函数打配合实现最终效果
先看两个
完整版如图:
Tip:递归的精髓在于回溯,很容易绕晕
2、strlen的模拟实现(指针)
同样先看代码
#include<stdio.h>
#include<string.h>
int Mystrlen2(const char* arr) //arr接收
{
char* temp = arr; //设置一个temp记录arr的首地址
while (1)
{
if (*arr++) //遍历到‘\0’
{
;
}
else
{
return arr - temp - 1; //利用,长度=指针-指针
}
}
}
int main()
{
char arr[5] = "abcd";//定义一个字符串
ret = Mystrlen2(arr);//调用函数
printf("%d ", ret);
return 0;
}
简短的解析
Tip:
1、不设置计数器
2、还记得嘛,指针-指针=字符串长度,那么我们需要拿到最后一个字符。
3、那么不使用strlen如何拿到最后一个字符?
答:既然string字符串后面必有\0,为何不试试用while遍历数组再和if打配合呢,
3、strlen的模拟实现(计数器)
看代码
#include<stdio.h>
#include<string.h>
int Mystrlen(const char* arr)//arr接收
{
//设置计数器
int count = 0;
while (*arr++)//解引用arr不为'\0'则++
{
count++;
}
return count;
}
int main()
{
char arr[5] = "abcd"; //定义一个字符串
int ret = Mystrlen(arr); //调用函数
printf("%d ", ret);
return 0;
}
二、strcpy函数
顾名思义:字符串拷贝( strcpy = string + copy )
注意:
1、strcpy遇到'\0'才停止
(1)、strcpy如何使用?
1、定义两个字符串
2、调用strcpy函数
3、打印
#include<stdio.h>
#include<string.h>
int main()
{
char src[10] = "abcd"; //定义源头字符串
char dest[11] = "*****"; //定义目的地字符串
char* ret = strcpy(dest, src); //调用strcpy函数
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c ", ret[i]);
}
return 0;
}
(2)、strcpy的两种模拟实现(指针、递归)
1、strcpy的模拟实现(指针)
#include<stdio.h>
#include<string.h>
char* Mystrcpy1(char* dest, char* src)
{
char* temp = dest; //设置一个变量存放初始dest的地址
while (*dest++ = *src++) //逐个字符拷贝
{
;
}
return temp;
}
int main()
{
char src[10] = "abcd"; //定义源头字符串
char dest[11] = "*****"; //定义目的地字符串
strcpy(dest, src); //调用strcpy函数
char* ret = Mystrcpy1(dest, src); //调用函数
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c ", ret[i]);
}
return 0;
}
2、strcpy的模拟实现(递归)
#include<stdio.h>
#include<string.h>
char* Mystrcpy2(char* dest,const char* src)
{
const char* temp = dest; //设置一个指针存放dest的初始地址
if (*src) //直到*src==0退出循环
{
*dest++ = *src++; //将src中的元素放到dest中
Mystrcpy2(dest, src); //重复调用Mystrcpy2函数
}
else
{
*dest = '\0'; //在dest末尾放一个'\0'
}
return temp; //回归
}
int main()
{
char src[10] = "abcd"; //定义源头字符串
char dest[11] = "*****"; //定义目的地字符串
char* ret = Mystrcpy2(dest, src); //调用函数
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c ", ret[i]);
}
return 0;
}
注意:
1、末尾必须有‘\0’,不然后面会残留dest的字符,或者会有系统生成的随机值。
三、strncpy函数
(1)、strncpy函数的使用
strncpy是字符串拷贝。n是限制拷贝的个数。
#include <stdio.h>
#include<string.h>
int main()
{
//strncpy
char str1[10] = "abcdef";
char str2[10] = "**"; //确保目标数组空间足够
char* ret = strncpy(str2, str1, 3);
puts(ret);
return 0;
}
(2)、strncpy的模拟实现
#include <stdio.h>
#include<string.h>
char* Mystrncpy(char* str1, char* str2,size_t num)
{
char* temp = str2;
while (num--)
*str2++ = *str1++;
*str2 = '\0';
return temp;
}
int main()
{
//strncpy
char str1[10] = "abcdef";
char str2[10] = "**"; //确保目标数组空间足够
//待拷贝的字符个数
int num = 3;
char* ret = Mystrncpy(str2, str1, num);
puts(ret);
return 0;
}
四、strcat函数
(strcat = string + concatenate)
strcat是追加字符串,在一个字符串后面加上另一个字符串。
(1)、strcat函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
char src[10] = "abcd"; //设置源头字符串
char dest[5] = "***"; //设置目标字符串
char* ret = strcat(src, dest);
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c ", ret[i]);
}
return 0;
}
(2)、strcat函数的模拟实现(指针)
1、strcat的模拟实现(指针)
#include<stdio.h>
#include<string.h>
char* Mystrcat1(char* src, char* dest)
{
char* temp = src; //设置字符串保存src的初始地址
while (*src) //遍历整个src字符串
src++;
while (*dest) //只要碰到dest后面的‘\0’退出
*src++ = *dest++; //把dest放在src后面
return temp; //返回src的初始地址
}
int main()
{
char src[10] = "abcd"; //设置源头字符串
char dest[5] = "123"; //设置目标字符串
char* ret = Mystrcat1(src, dest); //指针实现
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%c ", ret[i]);
}
return 0;
}
五、strncat函数
(1)、strncat的使用方法
#include<stdio.h>
#include<string.h>
int main()
{
//strncat
char str1[10] = "abc\0def";
char str2[10] = "**";
//char* ret = strncat(str1, str2, 3); //追加之后末尾自动补零
puts(ret);
return 0;
}
(2)、strncat的模拟实现
#include<stdio.h>
#include<string.h>
char* Mystrncat(char* str1, char* str2, size_t num)
{
char* temp = str1;
//遍历整个str1
while (*str1)
str1++;
while (num--)
*str1++ = *str2++;
*str1 = '\0';
return temp;
}
int main()
{
//strncat
char str1[10] = "abc\0def";
char str2[10] = "**";
//模拟实现
char* ret = Mystrncat(str1, str2, 3);
puts(ret);
return 0;
}
六、strcmp函数
(1)、strcmp的使用方法。
注意:
1、strcmp比较适用于长度相同的字符串
2、依旧是遇到‘\0’就停止
#include<stdio.h>
#include<string.h>
int main()
{
//定义两个字符串
char p1[10] = "abcdef";
char p2[10] = "abcd";
int ret = strcmp(p1, p2); //调用函数
printf("%d", ret); //打印
//打印
printf("%d ", ret);
return 0;
}
(2)、strcmp的模拟实现(指针)
1、strcmp的模拟实现(指针)
#include<stdio.h>
#include<string.h>
//指针
int Mystrcmp1(const char* p1, const char* p2)
{
char* s1 = (char*)p1; //把p1存放到临时指针s1中(p1类型为const char*,故强制类型转化)
char* s2 = (char*)p2;
char* cur = (char*)p1;
while(*s1)
{
s1 = cur;
s2 = (char*)p2;
while (*s1 && *s2 && *s1 == *s2) //s1和s2都不为'\0',进入循环
s1++;
s2++;
if (!*s2) //s2为0,直接return
return 0;
cur++;
}
if (*s1 > *s2) //s2不为0,判断字符串谁大谁小
return 1;
else
return -1;
}
int main()
{
//strcmp比较适用与长度相同的字符串
char p1[10] = "abcdef";
char p2[10] = "abcd";
//调用函数
int ret = Mystrcmp1(p1, p2);
//打印
printf("%d ", ret);
return 0;
}
七、strncmp函数
(1)、strncmp函数的使用
#include<stdio.h>
#include<string.h>
int main()
{
//strncmp
char str1[10] = "abcdef";
char str2[10] = "abbdeg";
int ret = strncmp(str1, str2, 3);
//打印
printf("%d ", ret);
return 0;
}
(2)、strncmp的模拟实现
#include<stdio.h>
#include<string.h>
int Mystrncmp(char* str1, char* str2, size_t num)
{
while (num--)
{
if (*str1++ != *str2++)
return str1-str2;
}
return 0;
}
int main()
{
//strncmp
char str1[10] = "abcdef";
char str2[10] = "abbdeg";
//模拟实现
int num = 3;
int ret = Mystrncmp(str1, str2, num);
//打印
printf("%d ", ret);
return 0;
}
八、strstr函数
(1)、什么是strstr?(strstr = string + string)
strstr是字符串查找函数。
例如:
char s1 = “abcd”;
char s2 = “b”;
strstr(s1,s2);//s2在s1中是否出现,是返回字符串首地址,不是返回-1。
(2)、strstr的模拟实现
#include<stdio.h>
#include<string.h>
//strstr
char* Mystrstr(char* str1, char* str2)
{
//在str1中查找这个字符串
char* p1 = str1;
char* p2 = str2;
char* cur = str1;
//循环str1,让cur一个一个往后走
while (*cur)
{
p1 = cur;
p2 = str2;
while (*p1 == *p2)
p1++,p2++;
if (!*p2)
return cur;
cur++;
}
return 0;
}
int main()
{
//使用
//定义两个字符串
char* str1 = "abbcdef";
char* str2 = "bbc";
//strstr的模拟实现
char* ret = Mystrstr(str1, str2);
//打印
if (!ret) //判断ret的返回值是否是空指针
printf("找不到");
else
puts(ret);
return 0;
}
九、strtok函数
(1)、什么是strtok?
字符串分割
例如:
char str = "i/am/a/student."
想把句子隔开,通过strtok函数。
用‘/’用作为隔开条件。
#include<stdio.h>
#include<string.h>
int main()
{
//使用
//定义两个字符串
char* str1 = "abbcdef";
char* str2 = "bbc";
char* ret = strstr(str1, str2);
//打印
if (!ret) //判断ret的返回值是否是空指针
printf("找不到");
else
puts(ret);
return 0;
}
(2)、strtok的模拟实现
#include<stdio.h>
#include<string.h>
//strstr
char* Mystrstr(char* str1, char* str2)
{
//在str1中查找这个字符串
char* p1 = str1;
char* p2 = str2;
char* cur = str1;
//循环str1,让cur一个一个往后走
while (*cur)
{
p1 = cur;
p2 = str2;
while (*p1 == *p2)
p1++,p2++;
if (!*p2)
return cur;
cur++;
}
return 0;
}
char* Mystrstr2(char* p1, char* p2)
{
}
int main()
{
//使用
//定义两个字符串
char* str1 = "abbcdef";
char* str2 = "bbc";
char* ret = strstr(str1, str2);
//strstr的模拟实现
ret = Mystrstr(str1, str2);
//打印
if (!ret) //判断ret的返回值是否是空指针
printf("找不到");
else
puts(ret);
return 0;
}