第一节课:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>#include<stdio.h>
#include<assert.h>
#include<string.h>#define N 30int my_strlen1(const char* str)
{if(NULL==str) return -1;const char *cp=str;while(*cp!='\0'){cp=cp+1;}return (int)(cp-str);//优化版:利用指针相减计算长度
}int main()
{const char *stra="hello";int len=my_strlen1(stra);printf("%d\n",len);return 0;
}int main()
{char stra[]={"tulun"};// '\0'char strb[]={"tulun"};char strc[]={'t','u','l','u','n'};char *pstra="tulun";char *pstrb="tulun";char *pstrc="'t','u','l','u','n'";int size=sizeof(stra);//6int len=strlen(stra);//5size=sizeof(pstra);//4,计算的是指针的大小,32位操作系统为4字节,64位操作系统为8字节size=sizeof("tulun");//6len=strlen(pstra);//5int l=strlen(pstrc);//计算错误,这里定义的字符串字符串并没有以\0结尾,计算长度的时候越界了,读取了下一个字符串的\0printf("%s\n",stra);printf("%s\n",pstra);printf("%d\n",l);//printf("%d\n",pstrc);//计算错误,这里定义的字符串字符串并没有以\0结尾,计算长度的时候越界了,读取了下一个字符串的\0printf("%d\n",(stra==strb));//0 stra和strb数组存放在.stack栈区,指针指向的地址不同printf("%d\n",(pstra==pstrb));//0 字符串常量存放在.data数据区的可读区,编译器将两个指针指向同一个地址pstra[0]='t';//出现异常。Segmentation fault,只可读不可写return 0;
}

第二节课:函数strcmp

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>int my_strcmp(const char *sp,const char *rp)
{assert(sp!=nullptr&&rp!=nullptr);while(*sp!='\0'&&*rp!='\0'&&*sp==*rp){sp=sp+1;rp=rp+1;}return (*sp-*rp);
}int my_strncmp(const char *sp,const char *rp,size_t count)
{assert(sp!=nullptr&&rp!=nullptr);if(0==count){//return 0;}while(*sp!='\0'&&*rp!='\0'&&--count){sp=sp+1;rp=rp+1;}return (*sp-*rp);}int main()
{char stra[]={"abcde"};char strb[]={"abdde"};int num=my_strcmp(stra,strb);int num1=my_strncmp(stra,strb,3);printf("%d %d",num,num1); return 0;
}

结果:

-1 -1

strchr函数实现:找到字符首次出现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>char* my_strchr(const char* str,char* ch)
{if(str==nullptr)return nullptr;char* p=(char*)str;while(*p!='\0'&&*p!=ch){p=p+1;}if('\0'==*p){p=nullptr;}return p;
}char *my_strrch1r(const char *str,char *ch)
{if(nullptr==str) return nullptr;char *p=(char*)str;p=p+strlen(str)-1;while((str-1)!=p)//优化版:利用指针相等{if(*p==*ch){return p;}--p;}return nullptr;
}int main()
{const char* str="onetwothree";char* p=strchr(str,'t');if(p!=nullptr){printf("%c\n",*p);}
}

strrchr函数编写:找到字符最后一次出现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>char* my_strrchr(const char* str,char* ch)
{if(str==nullptr)return nullptr;char* p=(char*)str;p=p+strlen(str)-1;//下标从0开始while((str-1)!=p)//-到0下标再减一,后退出循环,str不减一,则没有比较0下标{if(*p==ch){return p;}--p;}if('\0'==*p){p=nullptr;}return p;
}/*char* my_strrchr(const char* str,char* ch)
{if(str==nullptr)return nullptr;char* p=(char*)str;p=p+strlen(str)-1;//下标从0开始while(str!=p)//-到0下标再减一,后退出循环,str不减一,则没有比较0下标{if(*(p-1)==ch){return p-1;}--p;}if('\0'==*p){p=nullptr;}return p;
}
*/int main()
{const char* str="onetwothree";char* p=strrchr(str,'t');if(p!=nullptr){printf("%c\n",*p);}
}

strstr函数:此程序只能在c编译通过

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
/*
char* my_strstr(const char* str,const char* ch)
{if (str == nullptr)return nullptr;char* p = (char*)str;while (*p != '\0' && *p != ch){p = p + 1;}if ('\0' == *p){p = nullptr;}return p;
}
*/
int main()
{const char* str = "onetwothree";const char* substr = "two";char* p = strstr(str, substr);if (p != NULL){printf("%s\n", p);}else {printf("不匹配\n");}
}

strstr函数实现:字符串匹配

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strstr1(const char* str,const char* substr)//第二种写法
{if(nullptr==str||nullptr==substr)return nullptr;int n=strlen(str);int m=strlen(substr);int i=0,j=0;while(i<n&&j<m){if(str[i]==substr[j]){i++;j++;}else{i=i-j+1;//如果没有匹配上,回退回去,并加一j=0;}}if(j==m){return (char*)str+i-j;//匹配成功后返回开始匹配的地址}else{return nullptr;}
}char* my_strstr(const char* str,const char* substr)//第一种写法
{if(nullptr==str||nullptr==substr)return nullptr;int n=strlen(str);int m=strlen(substr);for(int i=0;i<n-m+1;++i){int j=0;int k=i;while(j<m&&str[k]==substr[j]){k=k+1;j=j+1;}if(j==m){return (char*)str+i;}}return nullptr;
}int main()
{const char* str="abccabcabbc";const char* substr="abca";char* p=my_strstr(str,substr);char* p1=my_strstr1(str,substr);if(p!=nullptr){printf("%s\n",p);      }else{printf("不匹配\n");}if(p1!=nullptr){printf("%s\n",p1);      }else{printf("不匹配\n");}return 0;
}

结果:

abcabbc
//成功匹配到字符串substr "abca"

strcpy函数:字符串拷贝函数

#include<stdio.h>
#include<assert.h>
#include<string.h>#define N 30char* my_strcpy(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;while(src[i]!='\0'){dst[i]=src[i];++i;}dst[i]='\0';return (char*)dst;
}char* my_strcpy1(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;while(*src!='\0'){*dst=*src;//这个函数这样写是错误的,dst++;src++;}*dst='\0';return (char*)dst;//返回的地址指向的的值是'\0',调用的时候strc拷贝成了'\0'
}char* my_strcpy2(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;char* dstt=dst;//这样写就对了while(*src!='\0'){*dstt=*src;//*dstt++=*src++;后置++先赋值后++dstt++;src++;}*dstt='\0';return (char*)dst;//
}char* my_strcpy3(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;char* dstt=dst;//这样写就对了while(*dstt++=*src++)//'\0'假{}return (char*)dst;//
}int main()
{char stra[N]={"tulun"};// \0char strb[N];char strc[N];const char* sp ="hello";my_strcpy(strc,my_strcpy3(strb,stra));printf("strb : %s\n",strb);printf("strc : %s\n",strc);//strb="hello";错误的,strb是数组元素首地址//strb=stra;错误的,地址不能赋值给地址return 0;
}

结果:

strb : tulun
strc : tulun

strcat:字符串连接函数

#include<stdio.h>
#include<assert.h>
#include<string.h>#define N 30char* my_strcpy(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;while(src[i]!='\0'){dst[i]=src[i];++i;}dst[i]='\0';return (char*)dst;
}char* my_strcat(char* dst,char* src)
{assert(dst!=nullptr&&src!=nullptr);char *dstt=dst;while(*dstt!='\0'){dstt++;}while(*dstt=*src){dstt++;src++;}return dst;
}char* my_strcat1(char* dst,char* src)
{   //第二种写法assert(dst!=nullptr&&src!=nullptr);char *dstt=dst+strlen(dst);my_strcpy(dstt,src);return dst;
}int main()
{char stra[N]={"tulun"};// \0char strb[N]={"hello"};char strc[N];my_strcat(strc,my_strcat1(stra,strb));printf("stra : %s\n",stra);printf("strb : %s\n",strb);printf("strc : %s\n",strc);//strb="hello";错误的,strb是数组元素首地址//strb=stra;错误的,地址不能赋值给地址return 0;
}

结果:

stra : tulunhello
strb : hello
strc : tulunhello

strdup函数:

#include<stdio.h>
#include<assert.h>
#include<string.h>#define N 30char* my_strcpy(char* dst,const char* src)
{assert(dst!=nullptr&&src!=nullptr);int i=0;while(src[i]!='\0'){dst[i]=src[i];++i;}dst[i]='\0';return (char*)dst;
}
char* my_strdup(const char* str)
{if(nullptr==str) return nullptr;int len=strlen(str)+1;char* s=(char*)malloc(sizeof(char)*len);//堆区my_strcpy(s,str);return s;
}
int main()
{const char *sp="hello";char *str=strdup(sp);printf("stra : %s\n",str);str[0]='x';printf("stra : %s\n",str);free(str);//失效指针str=nullptr;//printf("strb : %s\n",strb);//printf("strc : %s\n",strc);//strb="hello";错误的,strb是数组元素首地址//strb=stra;错误的,地址不能赋值给地址return 0;
}

94-99.字符串函数使用和实现详解相关推荐

  1. C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者 ...

  2. C语言字符串函数strcat,strcpy详解

    目录 一.CSDN解释: 1.strcat: 2.strcpy 二.strcat和strcpy 参数的理解 三.注意事项和使用 1.strcat注意事项: 2.代码: 3.补充思考: 4.strcpy ...

  3. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  4. Delphi Format函数功能及用法详解

    DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...

  5. 站长在线Python精讲:在Python中格式化字符串的两种方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...

  6. php。defined,PHP defined()函数的使用图文详解

    PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...

  7. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  8. python字符串_Python字符串格式化%s%d%f详解

    关于讨论输出格式化的问题,小编不是一时兴起,之前学习python的时候就经常遇到输出时"%d",一直没有仔细学习,今天又看到了,下面分享一个简单实例,python输出99乘法表: ...

  9. python 字符串格式化%s_Python字符串格式化%s%d%f详解

    关于讨论输出格式化的问题,小编不是一时兴起,之前学习python的时候就经常遇到输出时"%d",一直没有仔细学习,今天又看到了,下面分享一个简单实例,python输出99乘法表: ...

  10. python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解

    一文秒懂!Python字符串格式化之format方法详解 一文秒懂!Python字符串格式化之format方法详解 format是字符串内嵌的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符 ...

最新文章

  1. 计算机网络工程实用技术考试,计算机网络实用技术期中考试复习题.doc
  2. DAC8830可以当做电位器来使用吗?
  3. 【Efficient-Net】基于Efficient-Net效滤网的目标识别算法的MATLAB仿真
  4. !!导致大智慧公式总是死循环的编码风格
  5. 2021云上架构与运维峰会将于12月4日在上海举办,五大精彩看点不容错过
  6. 【2016年第4期】研究(国家自然科学基金项目成果集萃)导读
  7. SAGAN(G-lab介绍)
  8. php unicode乱码加密,PHP解密Unicode及Escape加密字符串
  9. 2021-09-23图嵌入方法
  10. Python的包管理工具
  11. 闭环控制 matlab仿真,反馈闭环控制系统Simulink仿真(带电流补偿的电压内环,直流调速)...
  12. DDR3 内存带宽计算
  13. 【mac系统连接打印机】提示错误信息,保持已备认证
  14. 深圳中院判决:利用网络爬虫技术抓取他人数据构成不正当竞争
  15. 只有1kb的清理软件_1kb病毒专杀工具下载
  16. 1867. 最大数量高于平均水平的订单
  17. iOS 警告 Local declaration of 'XXX' hides instance
  18. 好玩的读心术猜数字游戏
  19. 统计学第十二周,第十三周
  20. MSYS+MinGW64环境的搭建

热门文章

  1. 3G、3GPP、LTE、4G解释
  2. win10下Java的JDK11下载与安装教程
  3. 迈高图手机版_迈高图下载-迈高图最新版下载[地图软件]-天极下载
  4. 清华大学计算机杜瑜皓,立足改革、多元择优为清华选拔有理想有才能的优秀学子-清华大学新闻网...
  5. 苹果电脑推出MacOSMojave10.14.5支持隔空投放2
  6. android9手机* 代码,android Telephony学习 --- 第九篇 USSD简介
  7. python实现下载韩寒博客中的所有文章,在本地存储
  8. 电力系统分析设计matlab,电力系统分析课程设计-基于Matlab的电力系统潮流计算...
  9. ISO-9001质量管理体系认证经验分享
  10. 机械工程设计分析和Matlab应用(PDF版)