字符函数分析及模拟实现
目录
strlen:返回字符串的长度
strlen的模拟实现
strcpy:字符串的拷贝, strncpy:长度受限制的字符串拷贝
strcpy的模拟实现
strstr:字符串的查找
strstr的模拟实现
strcmp:字符串的比较 strncmp:长度受限制的字符串比较
strcmp的模拟实现
strcat:字符串的追加 strncat:长度受限制的字符串追加
strcat的模拟实现
1.strlen
注意:strlen的返回值是size_t(无符号整形)
具体用法:(别忘记strlen的头文件<string.h>)
#include <stdio.h>
#include <string.h>
int main ()
{
char arr[256];
printf ("请输入一个字符串: ");
gets (arr);
printf ("这个字符串所占大小为:%d\n",(unsigned)strlen(arr));
return 0;
}
1.1strlen函数的模拟实现
#include<stdio.h>
#include<string.h>
size_t fig_str(char *arr)
{
int count = 0;
assert(arr != NULL);
while (*arr++)
{
count++;
}
return count;
}
int main()
{
char arr[100] = { "aabcdefwcng" };
scanf("%s", arr);
int num=fig_str(arr);
printf("%d\n", num);
return 0;
}
2.strcpy
注意:1.strcpy函数的返回值是一个字符类型指针
2.源字符串(下图中的arr2)必须以‘\0’结束,不然printf输出时不会结束
3.目标空间(下图中的arr1)必须足够大,能够容下源字符串
4.目标空间必须可修改(不能修改的话,源字符串不能被拷贝了)
具体用法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcdefg"};
char arr[10]={"abc"};
strcpy(arr1,arr2);
return 0
}
2.1 strcpy函数的模拟实现
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* arr1, char* arr2)
{
while (*arr1++ = *arr2++);
return arr1;
}
int main()
{
char arr1[10] = { "0" };
char arr2[5] = { "0" };
gets(arr1);
gets(arr2);
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
2.2strncpy函数的介绍
strncpy和函数strcpy几乎用法一样,strncpy函数是一个限制长度的,即传入一个整形表示需要拷贝的字符数量
具体用法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcdefg"};
char arr2[10]={"abcd"};
char* ret=strncpy(arr1,arr2,3);
printf("%s",ret);
return 0;
}
注意:
strncpy是不会帮你在目标字串后面加0的,
所以用完strncpy不手动在后面加零的话,就会出错,一定要注意。
加零的方法有2个,
一是拷贝前,用ZeroMemory()把整个缓冲区置0。
二是计算好字串的实际长度,手动加0。
3.strstr
注意要点:strstr函数返回的是字字符号串首次出现的地址
具体用法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"bbcdfe"};
char arr2[10]={"cdf"};
char* ret=strstr(arr1,arr2);
printf("%s",ret);
return 0;
}
2.1strstr函数的具体实现
#include<stdio.h>
#include<string.h>
char* my_strstr(char* arr1, char* arr2)
{
assert(arr1 && arr2);
char* s1 = arr1;
char* s2 = arr2;
while (*arr1&&*arr2)
{
while (*arr1++!= *arr2);
s1 = arr1;
while (*arr1 == *arr2)
{
arr1++;
arr2++;
if (*arr2 == '\0')
{
return s1;
}
}
arr1 =s1 + 1;
}
return 0;
}
int main()
{
char arr1[10] = { "0" };
char arr2[10] = { "0" };
gets(arr1);
gets(arr2);
char* ret=my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
4.strcmp
注意点:该函数的返回值为int型整型
<0:说明str1小于str2;
=0:说明两个字符串相等;
>0:说明str1大于str2;
具体用法:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abc"};
char arr2[10]={"ac"};
int ret=strcmp(arr1,arr2);
if(ret>0)
printf("arr1更大");
else if(ret=0)
printf("两个字符串相等");
else
printf("arr2更大");
return 0;
}
4.1strcmp的模拟实现
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* arr1, const char* arr2)
{
while ((*arr1==*arr2)!='\0')
{
arr1++;
arr2++;
//if ((*arr1 == *arr2)=='\0')
if(*arr1==*arr2&&*arr1=='\0'&&*arr2=='\0')
{
return 0;
}
}
return *arr1 - *arr2;
}
int main()
{
char arr1[10] = { "0" };
char arr2[10] = { "0" };
gets(arr1);
gets(arr2);
int ret=my_strcmp(arr1,arr2);
if (ret > 0)
{
printf("arr1更大");
}
else if (ret ==0)
{
printf("一样大");
}
else if(ret<0)
printf("arr2更大");
return 0;
}
4.2strncmp函数的介绍
strncmp函数和strcmp用法一致,唯一的不同点是,strncmp是对前num个字符进行比较;
5.strcat
注意点:
具体实现:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcd"};
char arr2[3]={"ac"};
char* ret=strcat(arr1,arr2);
printf("%s",ret);
return 0;
}
5.1strcat模拟实现
#include<stdio.h>
#include<string.h>
char* my_strcat(char* arr1, const char* arr2)
{
while (*arr1)
{
arr1++;
}
while (*arr1 = *arr2)
{
arr1++;
arr2++;
}
return arr1;
}
int main()
{
char arr1[100] = { "0" };
char arr2[100] = { "0" };
gets(arr1);
gets(arr2);
my_strcat(arr1, arr2);
printf("%s\n",arr1);
return 0;
}
5.2strncat函数的介绍
strncat用法和strcat一致,唯一的不同就是strncat拷贝的是前num个字符.