当前位置: 首页 > news >正文

c语言中字符串函数strlen,strcmp,strcpy,srtcat,strncpy,strncat,strncmp

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;} 

http://www.lryc.cn/news/466284.html

相关文章:

  • 携程线下一面,面试内容:
  • DeepL翻译:全世界最准确的翻译
  • 15分钟学Go 实战项目一:命令行工具
  • lesson02 作业
  • 港大和字节提出长视频生成模型Loong,可生成具有一致外观、大运动动态和自然场景过渡的分钟级长视频。
  • RabbitMQ进阶_可靠性
  • JavaScript字符串的常用方法有哪些?
  • jmeter发送post请求
  • 图文深入理解Oracle Total Recall
  • 腾讯云控制台URL刷新URL预热 使用接口刷新
  • 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像
  • libaom-all-intra参数说明
  • 应用假死?
  • SAP MM+FI - 物料管理模块与财务会计模块的集成配置
  • 初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)
  • mysql迁移到达梦的修改点
  • Go小技巧易错点100例(十八)
  • 【python】极简教程8-字符串
  • UEFI EDK2框架学习 (四)——UEFI图形化
  • 【C++】— 一篇文章让你认识STL
  • mysql--索引
  • 【linux】线程 (三)
  • c++日常积累
  • 字节流写入文件
  • Torch模型导入
  • 博弈论:博弈类型空间集合;三层博弈拓展式;
  • 数据库表的关联、集合操作
  • word怎么清除格式,Word一键清除所有格式教程
  • ShardingProxy服务端分库分表
  • 开源的 FOC(Field-Oriented Control) 项目