一、模拟实现库函数strlen
解释:strlen 是求字符串长度的,求出的长度是不可能为负数 所以返回类型设置为size_t 也是合情合理的 typedef unsigned int size_t\
注意
字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
size_t strlen ( const char * str );参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是无符号的
strlen("abc")-strlen("abcdef") 3- 6 结果仍然是3
接下来模拟实现strlen 有三种方法 代码如下
包含头文件#include<stdio.h>
#include<assert.h>
#include<stdio.h>
#include<assert.h>
//数组传参
int my_strlen(const char* str)
{
assert( str != NULL);
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
#include<stdio.h>
#include<assert.h>
// 递归
int my_strlen2(const char* str)
{
assert(str != NULL);
if (*str != '\0')
return 1 + my_strlen2(str + 1);
else
return 0;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen2(arr);
printf("%d\n", len);
return 0;
}
#include<stdio.h>
#include<assert.h>
// 指针减指针
int my_strlen3(const char* str)
{
const char* start = str;
assert(*str != NULL);
while (*str)
{
str++;
}
return str - start;
int main()
{
char arr[] = "abcdef";
int len = my_strlen3(arr);
printf("%d\n", len);
return 0;
}
二、模拟实现strcpy
要想实现strcpy 我们要知道其功能 对字符串进行拷贝
注意 函数的返回类型是char* #include<string.h>
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
代码如下
使用strcpy函数的注意事项
1.目标字符串必须有足够的空间来存储源字符串src的内容,负责可能会发生缓冲区溢出的问题。
2,在使用strcpy函数时,应确保源字符串src以'\0'结尾,负责可能会导致复制结果不正确。
3,当目标字符串dest和源字符串src重叠时,使用strcpy函数可能会导致未定义的行为,应避免这种情况的发生。
#include<string.h>
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "*******************";
char arr2[] = "asdfghj";
printf("%s\n", my_strcpy(arr1, arr2));//打印拷贝完的字字符串
return 0;
}
模拟实现strcat
strcat函数用于将源字符串追加到目标字符串的末尾,并返回一个指向目标字符串的指针,它可以实现字符串的拼接操作。
注意 函数的返回类型是char* 包含头文件#include<string.h>
源字符串必须以 '\0' 结束。目标空间必须有足够的大,能容纳下源字符串的内容。目标空间必须可修改。
使用strcat函数注意事项(就是将两个字符串拼接在一起)
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "hello\0*********";
char str2[] = "world";
strcat(str1, str2);
printf("%s\n", str1);
return 0;
}
使用strcat函数给目标字符串追加字符时,首先要找到目标字符串中'\0'的位置,然后在'\0'的位置上向后追加源字符串。由上图我们可以看出源字符串str2是从目标字符串str1中的'\0'位置开始追加的,同时源字符串str2中的'\0'也一并追加了过去。
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//找到目标空间 \0
while (*dest)
{
dest++;
//追加
}
while(*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* p = "world";
my_strcat(arr1, p);
printf("%s\n", arr1);
return 0;
}
模拟实现strcmp
注意
功能 两个字符串的比较 库函数#include<string.h>
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
#include<string.h>
#include<stdio.h>
#include<assert.h>
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;
}
int main()
{
char arr1[] = "abq";
char arr2[] = "abcdef";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf("arr1>arr2\n");
printf("%d\n", ret);
return 0;
}
这里的的14 是因为 在每个字符进行比较时q-c 的ascll码 113-99=14
模拟实现strstr
strstr函数的功能是在一个字符串中查找另一个字符串中出现的,并且返回该位置的指针,如果找不到,则返回NULL. 头文件#includ<string.h>
str1:被查找的目标字符串 str2:要查找的对象字符串
实现原理 通过遍历字符串的方式来查找str2出现的位置
1. 遍历str1字符串,逐个字符与str2字符串进行比较。
2,如果str1字符串的当前字符与str2字符串的第一个字符相等,则继续比较后续字符。
3,如果str1字符串中的连续字符与str2字符串完全匹配,则返回该位置的指针。
4,如果str1字符串遍历完毕仍未找到匹配,则返回NULL。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "hello world";
char str2[] = "world";
char* ret = strstr(str1, str2);
if (ret == NULL)
printf("找不到\n");
else
printf("%s\n", ret);
return 0;
}
打印的是从第一次找到的那个位置开始后面的所有字符
接下来模拟实现strstr
#include<stdio.h>
#include<string.h>
#include<assert.h>
const char* my_strstr(const char* str1, const char* str2)
{
const char* cp;//记录开始匹配的位置
const char* s1;//遍历str1指向的字符串
const char* s2;//遍历str2指向的字符串
assert(str1 && str2);//处理空指针的情况
if (*str2 == '\0')//如果str2 为空字符串 ,则返回str1
return str1;
cp = str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)//在str1中找到str2的第一个字符
{
s1++;
s2++;
}
if (*s2 == '\0')//找到str2 中的所有字符,则返回该位置的指针
return cp;
else
cp++;
}
return NULL;
}
}
int main()
{
char str1[] = "hello world!";
char str2[] = "world";
const char* ret = my_strstr(str1,str2);
if (ret == NULL)
printf("找不到\n");
else
printf("%s\n", ret);
return 0;
}
标签:strstr,str2,str1,strcat,char,字符串,return,include,库函数
From: https://blog.csdn.net/2402_86583623/article/details/142814882