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

常见字符串函数的使用和模拟使用

1.strlen函数

1.1 strlen函数的原型和使用说明

函数原型:size_t strlen(const char *str)(size_t返回值的是无符号的)

参数说明:指向以null结尾的字符串的指针(参数指向的字符串必须以‘\0’结束)

返回值:字符串的长度(不包括null终止符)

1.2 strlen函数的使用

#include <stdio.h> #include <string.h> int main() { char str[] = "Hello, World!"; size_t length = strlen(str); printf("Length: %zu\n", length); return 0; }

1.3 strlen函数的模拟实现

下面我们来模拟实现一下strlen函数计算器方式

首先我们定义一个变量count来计算,每走一步,count+1;同时地址str+1;

直到*str 遇到‘\0’跳出循环,从而得到count值

size_t my_strlen(const char *str) { size_t count = 0; while (*str != '\0') { count++; str++; } return count; }

2 strcpy函数的使用和模拟实现

  • 标准库函数strcpy的作用(字符串复制)
  • 函数原型:char *strcpy(char *dest, const char *src)
  • 返回值与参数说明(目标地址dest,源地址src
  • 源字符串必须以‘\0’结束。
  • strcpy函数会将源字符串中的‘\0’拷贝到目标字符串中。
  • 必须确保dest有足够空间容纳src(包括\0),否则导致缓冲区溢出。
char src[] = "Hello"; char dest[10]; strcpy(dest, src); // dest现在包含"Hello"

2.1 strcpy函数的模拟实现

char *my_strcpy(char *dest, const char *src) { char *ret = dest; while (*src != '\0') { *dest++ = *src++; } *dest = '\0'; // 添加终止符 return ret; }

while循环函数中的内容还可以换一个写法

char *my_strcpy(char *dest, const char *src) { char *ret = dest; while (*src != '\0') { *dest=*src dest++; src++; } *dest = '\0'; // 添加终止符 return ret; }

3.strcat函数的使用和模拟实现

函数原型为:char *strcat(char *dest, const char *src);

  • 参数dest为目标字符串缓冲区,需确保有足够空间;src为待追加的源字符串。
  • 返回值:返回目标字符串的起始地址。

3.1 strcat函数的使用

#include <stdio.h> #include <string.h> int main() { char dest[20] = "Hello"; char src[] = " World!"; strcat(dest, src); // 输出: "Hello World!" printf("%s\n", dest); return 0; }

这里打印目标函数字符串函数时,只需传一个起始地址就可以了,它会顺着起始地址往后打印,直到遇到‘\0’结束。

3.2 strcat函数的模拟实现

char *my_strcat(char *dest, const char *src) { char *ptr = dest; //先把目标字符串的起始地址放到ptr中,因为下面指针计算,会导致目标起始地址发生改变 while (*dest != '\0') dest++; // 找到目标字符串末尾,下一步开始追加字符 while (*src != '\0') { *dest=*src; dest++; src++; } // 逐字符追加,直到遇到源字符串的‘\0’结束 *dest = '\0'; //这里的dest经过上述计算,dest的地址已经改变,最后以'\0'收尾 return dest; }
  1. 遍历dest至末尾;
  2. src的字符逐个拷贝到dest末尾;
  3. 添加字符串终止符\0

4strcmp函数的使用和模拟实现

trcmp函数的基本介绍
  • 标准库函数strcmp的作用:比较两个字符串
  • 函数原型:int strcmp(const char *str1, const char *str2);
  • 返回值含义:
    • 返回0表示字符串相等
    • 返回值大于0表示str1大于str2
    • 返回值小于0表示str1小于str2

4.1 strcmp函数的使用

#include <stdio.h> #include <string.h> int main() { char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); //这里比较的是字符的ASCLL码值,如果第一个字符就已经比较出大小,那么后面的字符比较是无意义的。 printf("result: %d\n", result); return 0; }

4.2 strcmp函数的模拟实现

int my_strcmp(const char *str1, const char *str2) { asssert(str1 && str2); //保证指针不为空指针,利用assert断言,需包含头文件#include<assert.h> while (*str1 && (*str1 == *str2)) { str1++; str2++; } //(*str1确保str1没有遇到‘\0’,没有到达字符串末尾) //(*str1==*str2)确保当前比较的字符相等 return *(unsigned char *)str1 - *(unsigned char *)str2; //因为字符串的长度是无符号的,所以需要先强制类型转换为无符号类型,再解引用。 }

这里有一个疑惑,就是为什么不保证str2不遇到‘\0’呢?其实上面的条件已经隐含了对str2的检查。下面我们分两种情况来看。

情况一:str2先达到末尾(*str2==‘\0’)

如果str2先结束,那么*str2的值就是0,此时要满足*str1==*str2,就必须让*str1也等于0.这意味着str1也必须同时到达末尾。

如果str1也到达末尾(*str1==0),那么 *str1 && (*str1==*str2)就不成立,循环也就会停止。

如果str1还没到达末尾(*str1!=‘\0’),那么*str1==*str2这个条件就不成立,循环就会终止

情况二:str1先到达末尾(*str1==‘\0’)

此时*str1的值就是0,*str1 && (*str1==*str2)这个条件就直接判定为假,终止循环

5.strstr函数的使用和模拟实现

strstr是C语言标准库中的一个字符串查找函数,用于在主字符串中查找子字符串的首次出现位置。

char *strstr(const char *str1, const char *str2);

5.1 strstr函数的使用

#include <stdio.h> #include <string.h> int main() { const char *str1 = "Hello, world!"; const char *str2 = "world"; char *result = strstr(str1,str2); if (result) { printf("找到了: %ld\n", result -str1); } else { printf("没找到\n"); } return 0; }

5.2 strstr函数的模拟实现

char *my_strstr(const char *str1, const char *str2) { if (*str2 == '\0') { return (char *)str1; } //如果子字符串为0,就直接返回主字符串的起始地址,即‘\0’ for (; *str1 != '\0'; str1++) { const char *p1 = str1; const char *p2 = str2; while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; } if (*p2 == '\0') { return (char *)str1; } } return NULL; }
http://www.jsqmd.com/news/449795/

相关文章:

  • 2026 年 3 月大连 AI 优化公司推荐 TOP5:技术深度落地应用,环渤海企业增长选型指南
  • 洞鉴软件部署(Summary)
  • 模型压缩:剪枝
  • 网络安全行业300万人才缺口揭秘:零基础也能入行,资深工程师年薪高达150万!
  • 警惕!申博90%的坑,都藏在“低价辅导”里|申博有术教你避坑
  • Qwen3-ASR-0.6B与计算机网络:分布式语音识别系统设计
  • 22年一区Applied Energy独家复现] ‘基于合作博弈模型的多微网间日前研究:实现区...
  • 100吨四柱液压机(全套共86份CAD图纸+使用说明书)
  • 2026选购橡胶辊加工厂,哪家有创新能力且经验丰富、性价比好 - 工业设备
  • AI发展这么快,会不会替代人类的工作?从历史周期到行业现状的深度思考
  • 线程池 ThreadPoolExecutor:Java并发的智能生产线调度系统
  • 网络安全行业现状解析:未来趋势如何?入行是否仍具潜力?
  • 异步沟通术:让全球团队无缝协作——软件测试从业者的专业指南
  • 太原洗浴设计好用机构
  • 2026专业的空气加热器推荐,江苏好用品牌费用多少 - mypinpai
  • 当AI学会“动手“的那一天:2026年3月,科技圈发生了什么?
  • 伦理实战:癌症AI生存概率算法的测试困境与技术破局
  • AI智能体入门指南:从小白到实战收藏,解锁数字员工新机遇!
  • 关键词:分布鲁棒;复现;电气综合能源系统;分布鲁棒机会约束(DRCC);ADMM分布式算法:非...
  • 基于卷积神经网络结合最小二乘支持向量机(CNN-LSSVM)的多输出数据回归预测 CNN-LS...
  • 探讨北京海淀办公空间租赁,弘源首著大厦出租费用怎么算 - 工业推荐榜
  • Java 企业如何平稳落地 AI:从老系统改造到大模型接入的
  • 【月球】卡尔曼滤波器月球陨石坑导航【含Matlab源码 15108期】
  • 基于 python+AI-vue的萨默旅游公司网站设计
  • 2026转行要趁早!盘点网络安全的岗位汇总
  • 深聊麦颂智能运营专业公司 如何选购靠谱的 - myqiye
  • Qwen3-ASR-1.7B部署案例:高校在线课程视频自动生成双语字幕流程
  • 2026年电磁流量计生产厂排名,价格合理又好用的品牌 - 工业品网
  • 2026年四川达州通川:这家‘什么都有’的电器门店凭啥成行业
  • 收藏!小白程序员必看:用本地开源小模型玩转Agent Skill,摆脱闭源API限制