目录
前言
1.求字符串长度函数
strlen
strlen的使用:
#include <string.h>//字符串函数头文件都为string.h
int main()
{
char arr[] = "abcdefhgsaidiowqbnjcdankljasd";
printf("%d", stlen(arr));//直接使用链式调用把string返回值打印出来
return 0;
}
strlen的模仿实现:
int my_strlen(const char* str)//因为我们只是数有多少个字符并不对字符串进行修改故参数设置为const确保安全
{
assert(str);
int count = 0;//计数器
while (*str++)//如果*str=\0的时候结果为假,循环停止.++为后置++先使用后加加
{
count++;
}
return count;
}
int main()//---模仿strlen
{
char arr[] = "abcdefhgsaidiowqbnjcdankljasd";
printf("%d", my_strlen (arr));
return 0;
}
有人会奇怪库函数声明返回函数是size_t的 为什么我的模仿实现要是int的呢?看一段代码:
#include <stdio.h>
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0; }
如果是用size_t的话 那么这个的结果会很尴尬 永远都是str2>str1 所以我们自己模仿实现的时候就用int,个人觉得这个函数用size_t作为返回值的类型会比较尴尬~
2.长度不受限制字符串
① strcpy
strcpy的使用
#include <string.h>
int main()
{
char arr1[30] = "xxxxxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world";
printf("%s\n", strcpy(arr1, arr2));
return 0;
}
strcpy的模拟实现
char* my_strcpy(char* dest, const char* src)//源字符串不做修改,const修饰确保安全
{
char* str = dest;//记录目的地字符串起始地址
assert(dest && src);
while (*dest++ = *src++)//利用++先使用后++的特性直接进行拷贝
{
;
}
return str;
}
int main()
{
char arr1[30] = "xxxxxxxxxxxxxxxxxxxxxx";
char arr2[] = "hello world";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
结果为:
②strcat
strcat的使用
#include <string.h>
int main()
{
char arr1[30] = "hello ";
char arr2[] = "world";
printf("%s", strcat(arr1, arr2));
return 0;
}
strcat的模拟实现
char* my_strcat(char* dest, const char* src)
{
char* str = dest;
assert(dest && src);
while (*dest)//先定位到目的地字符串中的\0
{
dest++;
}
while (*dest++ = *src++)//进行拷贝
{
;
}
return str;
}
int main()//---模拟实现strcat
{
char arr1[30] = "hello ";
char arr2[] = "world";
printf("%s", my_strcat(arr1, arr2));
return 0;
}
③strcmp
strcmp的使用:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bbq";
int a = strcmp(arr1, arr2);
if (a > 0)
printf("arr1>arr2");
else if (a < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
strcmp的模拟实现:
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[] = "abcdef";
char arr2[] = "abcdef";
int a = my_strcmp(arr1, arr2);
if (a > 0)
printf("arr1>arr2");
else if (a < 0)
printf("arr1<arr2");
else
printf("arr1==arr2");
return 0;
}
3.长度受限制的字符串函数
① strncpy
strncpy的模拟实现:
char* my_strncpy(char* dest, const char* src, size_t num)
{
char* set = dest;
assert(dest && src);
while (num)
{
if (*src != '/0')
{
*dest = *src;
src++;
}
else
{
*dest = '/0';
}
dest++;
num--;
}
return set;
}
int main()//--模仿strncpy
{
//保证目标字符串空间足够大
char arr1[30] = "xxxxxxxxxx";
char arr2[] = "hellowor";
printf("%s\n",my_strncpy(arr1, arr2, 5));
return 0;
}
② strncat
strncat的模拟实现
char* my_strncat(char* dest, const char* src, size_t num)
{
char* str = dest;
assert(dest && src);
while (*dest)
{
dest++;
}
while (num)
{
if (*src != '\0')
{
*dest = *src;
src++;
}
else
{
*dest = '\0';
}
dest++;
num--
;
}
if (*src)
{
*dest = '\0';
}
return str;
}
int main()//--模仿strncat
{
char arr1[30] = "xxxxx\0xxxxx";
char arr2[] = "abc";
printf("%s\n", my_strncat(arr1, arr2, 5));
return 0;
}
③ strncmp
strncmp模拟实现:
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
if (!num)
{
return 0;
}
size_t x = num;
for (; x < num; x++)
{
if (*str1 != '\0' || *str1 != *str2)
return *(unsigned char*)str1 - *(unsigned char*)str2;//无符号类型返回下面以有符号打印也是对的结果
str1++;
str2++;
}
}
int main()//--模仿strncmp
{
char arr1[] = "abcdef";
char arr2[] = "abccde";
printf("%d", my_strncmp(arr1, arr2, 4));
return 0;
}
3.字符串查找函数
strstr
strstr函数的使用
int main()//
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = strstr(arr1, arr2);
if (NULL == ret)
printf("没找到\n");
else
printf("找到了\n");
return 0;
strstr函数的模拟实现:
char* my_strstr(const char* str, const char* substr)
{
const char* s1 = NULL;//用于移动和源字符中的字符做比较
const char* s2 = NULL;//用于记录源字符和目的地字符是否相等
const char* ctr = str;//记录查找开始的地址
assert(str && substr);
if (substr == '\0')//如果substr一开始就为\0 则返回substr
{
return (char*)substr;
}
while (*ctr)//用ctr记录本次查找开始的地址
{
s1 = ctr;
s2 = substr;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')//如果s2一旦=\0 那么就证明substr是str中的子串 返回这个子串开始的地址
return (char*)ctr;
ctr++;
}
return NULL;
}
int main()//---模仿strstr
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (NULL == ret)
printf("没找到\n");
else
printf("找到了\n");
return 0;
}