以下是我从网上学习的关于strlen、strcpy、strcmp、strcat、strstr实现方式的总结。
一、strlen——求字符串长度
👉strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' ),并且其返回类型为size_t(unsigned int无符号整形)。
计数器方式
size_t my_strlen1(const char* arr)//const用于使arr所指向的对象不发生改变
{
assert(arr!=NULL);//需要引用assert.h头文件
int count=0;
while(*arr++)
{
count ++;
}
return count;
}
不能创建临时变量计数器——用递归
size_t my_strlen2(const char* arr)
{
assert(arr!=NULL);
if(*arr)
{
return 1+my_strlen2(arr+1);
}
return 0;
}
指针减指针的方式
size_t my_strlen3( char* arr)
{
assert(arr!=NULL);
char* tmp=arr;
while(*tmp!='\0')
{
tmp++;
}
return tmp-arr;
}
👉以上三种方法的输出结果如下
#include <stdio.h>
#include <assert.h>
int main(){
char arr[20]={0};
scanf("%s",&arr);
printf("%d\n", my_strlen1(arr));
printf("%d\n", my_strlen2(arr));
printf("%d\n", my_strlen3(arr));
return 0;
}

二、strcpy——字符串复制
👉strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++);
return ret;
}
👉以上方法的输出结果如下
#include <stdio.h>
#include <assert.h>
int main() {
char dest[20] = "****************";
char src[20] = { 0 };
scanf("%s", &src);
printf("%s\n", my_strcpy(dest, src));
return 0;
}

三、strcmp——比较字符串str1和str2
👉一般形式:strcmp(str1,str2)
👉该函数返回值如下:
如果返回值小于 0,则表示 str1 < str2。
如果返回值大于 0,则表示 str1 > str2。
如果返回值等于 0,则表示 str1 = str2。
int my_strcmp(const char* str1,const char* str2)
{
assert(str1&&str2);
while(*str1==*str2)
{
if(*str1=='\0')
{
return 0;
}
str1++;
str2++;
}
return *str1-*str2;
}
👉以上方法的输出结果如下
#include <stdio.h>
#include <assert.h>
int main(){
char str1[20]={0};
char str2[20]={0};
scanf("%s %s",&str1,&str2);
int ret=my_strcmp(str1,str2);
if(ret > 0)
{
printf("str1 > str2\n");
}else if(ret < 0)
{
printf("str1 < str2\n");
}else
{
printf("str1 = str2\n");
}
return 0;
}



四、strcat——一个字符串追加到另一字符串的结尾
👉char* my_strcat(char * dest,const char * src)
dest —— 指向目标数组
src —— 指向要追加的字符串
该函数返回一个指向最终的目标字符串 dest 的指针。
❗字符串不能自己给自己追加
char* my_strcat(char * dest,const char * src)
{
char* ret=dest;
assert(dest&&src);
//1.找到目标字符串中的'\0'
while(*dest)
{
dest++;
}
//2.追加源字符串,包括'\0'
while(*dest++ = *src++);
//返回目标空间的起始地址
return ret;
}
👉以上方法的输出结果如下
#include <stdio.h>
#include <assert.h>
int main(){
char dest[20]={0};
char src[20]={0};
scanf("%s %s",&dest,&src);
printf("%s\n",my_strcat(dest,src));
system("pause");
return 0;
}

五、strstr——返回字符串中首次出现子串的地址
👉char *strstr(const char *str1, const char *str2)
str1: 指向被查找目标
str2: 指向要查找对象
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;
如果str2不是str1的子串,则返回NULL。
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
//1.当被查找目标是空字符串时
if (*str2 == '\0')
{
return (char*)str1;
}
//2.当被查找目标不是空字符串时
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 str1[20] = { 0 }; //str1: 指向被查找目标
char str2[20] = { 0 }; //str2: 指向要查找对象
//char str2[]="";
scanf("%s %s", &str1, &str2);
//scanf("%s", &str1);
//判断str2是不是str1的子串,并返回相应的内容给ret
char* ret = my_strstr(str1, str2);
if (ret != NULL)
{
printf("str2是str1的子串\n");
}
else
{
printf("str2不是str1的子串\n");
}
return 0;
}



如有错漏之处,敬请指正!