1.strlen的使用和模拟实现
strlen 用来求字符串的长度,统计'\0'之前字符的个数。
模拟实现1:计数参数法
#include<stdio.h>
#include<assert.h>
size_t my_strlen(char* str)
{
int count=0;
assert(str);//assert断言是判断是字符串不能为空
while(*str!='\0')
{
count++;//计数
str++; //指向下一个元素
}
return count;//返回字符的个数
}
int main()
{
char arr[]="abcdef";//初始化
size_t len =my_strlen(arr);//调用函数
printf("%d\n",len);//打印出字符的个数
return 0;
}
模拟实验2:指针方法
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
const char*start=str;
assert(str);//assert断言是判断是字符串不能为空
while(*str!='\0')
{
str++; //指向下一个元素
}
return str-start;
}
int main()
{
char arr[]="abcdef";//初始化
size_t len =my_strlen(arr);//调用函数
printf("%d\n",len);//打印出字符的个数
return 0;
}
模拟实验3:递归方法
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);//assert断言是判断是字符串不能为空
if(*str!='\0')
{
return 1+my_strlen(str+1);//递归方法
}
else
{
return 0;//返回字符的个数
}
}
int main()
{
char arr[]="abcdef";//初始化
size_t len =my_strlen(arr);//调用函数
printf("%d\n",len);//打印出字符的个数
return 0;
}
2,strcpy 的使用和模拟实现(拷贝字符串)
char* strcpy(char * destination,const char * source);
1:源字符串必须以’\0‘结束
2:会将源字符串中的’\0‘拷贝到目标空间
3:目标空间必须足够大,以确保能存放源字符串
4:目标空间必须可以修改
strcpy的模拟实现一:
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* dest,const char* str)
{
assert(str&&dest);//assert断言是判断是字符串不能为空
char*ret=dest;//将目标字符的首地址复制给ret
while(*dest++=*src++)//直到src复制完成后到最后的\0
{
;
}
*dest=*src;//再将最后的\0复制过去
return ret;//返回目标空间的起始地址
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]={0};
my_strcpy(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面
printf("%s\n",arr2);//打印出arr2字符
return 0;
}
strcpy的模拟实现二:
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* dest,const char* src)
{
while(*src!='\0)//直到src复制完成后到最后的\0
{
assert(dest);//调到的函数不为空
*dest=*src;//赋值头指针
dest++;
src++;
}
*dest=*src;//再将最后的\0复制过去
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]={0};
my_strcpy(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面
printf("%s\n",arr2);//打印出arr2字符
return 0;
}
3.strcat的使用和模拟实现(连接)
源字符串必须以'\0'结束
目标字符串中也得有\0,否则没办法知道追加从哪里开始
目标空间必须有足够大,能容纳下源字符串的内容
目标空间必须可以修改
strcat模拟实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest,const char* src)
{
char*ret=dest;//将dest的首地址赋值给ret
assert(src);//判断使src字符串不为空
while(*dest!='\0)
{
dest++; //直到找到dest字符串的末尾
}
while(*dest++=*src++)//依次进行赋值
{
;
}
return ret;// 返回ret的值
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]={0};
my_strcat(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面
printf("%s\n",arr2);//打印出arr2字符
return 0;
}
那么strcat可以自己复制自己吗?
不可以,那样的话就找不到'\0'了,'\0'被覆盖了,就停不下来了。
4.strcmp的使用和模拟实现
*第一个字符串大于第二个字符串,则返回大于0的数字
*第一个字符串等于第二个字符串,则返回0
*第一个字符串小于第二个字符串,则返回小于0的数字
int strcmp(const cahr*str1,const char *str2)
比较的不是字符串的长度,而是对应位置上字符的大小。
strcmp函数的模拟实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strcmp(const char*str1,const char* str2)
{
assert(str1&&str2);//assert断言是两个字符出串都不为空
while(*str1==*str2)
{
if(*str1=='\0')//在循环里面比较完后,说明都相等
{
return 0;
}
str1++;//字符相等的时候继续往后进行比较
str2++;
}
return (*str1-*str2);//返回他们的差值
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[]="abcfr";
int ret=my_strcmp(arr1,arr2);//调用函数将arr1里面的字符与arr2及进行比较
printf("%d\n",ret);//打印出返回的值
return 0;
}
5.strncpy函数的使用和模拟实现
char *strncpy(char * dest ,char * src , size_t num)
//多了这么一个参数,就是将src中num个字符拷贝给dest
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]="{0}";
strncpy(arr2,arr1,3); //将arr1中的三个字符 拷贝给arr2
printf("%s",arr2);
return 0;
}
strncpy的模拟实验
#include<stdio.h>
void my_strncpy(char* dest,const char* src,size_t num)
{
size_t i=0;
for(i=0;i<num&&*src!='\0';i++)//判断条件是src不为空的时候对其进行赋值
{
*dest=*src;
dest++;
src++;
}
for(;i>num;i++)//将dest后的字符置为空
{
*dest='\0';
}
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]="{0}";
my_strncpy(arr2,arr1,4); //将arr1中的三个字符 拷贝给arr2
printf("%s",arr2);
return 0;
}
6.strncat的使用和模拟实现
char * strncat(char *dest,const *src,size_t num)
//多了这么一个参数,就是src从末尾开始加num个字符
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]="{0}";
my_strncpy(arr2,arr1,4); //将arr1中的三个字符 拷贝给arr2
printf("%s",arr2);
return 0;
}
strncat的模拟实现
#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strcat(char *dest,const char* src,size_t num)
{
assert(dest&&src);
size_t i;
while(*dest!='\0')
{
dest++;//是指针指到dest的尾指针
}
for(i=0;i<num&&*src!='\0';i++)
{
*dest=*src;//将num个字符依次加到dest里面
dest++;
src++;
}
*dest='\0';//把末尾的\0加上
}
int main()
{
char arr1[]="abcdef";//初始化
char arr2[20]="hahhah";
my_strcat(arr2,arr1,4); //将arr1中的4个字符加到arr2后面
printf("%s",arr2);
return 0;
}
7.strncmp的使用和模拟实现
char *strncmp(char *dest,const char *src,size_t num)
//多了一个num是最多比较字符的个数
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="abcdefg";
char arr2[]="abcfr";
int ret=strncmp(arr1,arr2,4);//将arr1和arr2的前四个字符进行比较
printf("%d",ret);
return 0;
}
//说明arr1对应字符的大小比arr2小。
strncmp的模拟实现
#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* dest,const char*src,size_t num)
{
assert(dest&&src);
for(size_t i=0;i<num;i++)
{
if(dest[i]!=src[i])//如果字符不相等返回差值
{
return (unsigned char)dest[i]-(unsigned char)src[i];
}
if(dest[i]=='\0')//如果遇到的也会继续比较,直到num个结束后
{
return 0;//前几个字符相等返回0
}
}
return 0;
}
int main()
{
char arr1[]="abcdefg";
char arr2[]="abcfr";//初始化
int ret=my_strncmp(arr1,arr2,4);//将arr1和arr2的前四个字符进行比较
printf("%d",ret);
return 0;
}