字符串操作学习
简介在常见的代码编写中程序员都必须要跟各种各样的字符串打交道有的需要从字符串中获取某个数据有的要将数据拼接成字符串有时又需要我们球的字符串的长度所以掌握如何处理字符串显得尤为重要一.基础操作--长度、复制、拼接、比较1.strlen--获取字符串长度(不计入\0)size_t strlen(const char *s)功能获取字符串s的长度返回值返回字符串的长度拓展size_t是无符号整型具体大小根据平台不同而变化以下代码进行测试一般为8字节size_t len strlen(hello); printf(%zu, len); //%zu是专门用于打印size_t类型的参数需要计算长度的字符串2.strcpy--复制字符串char *strcpy(char *dest, const char *src)功能将src中的字符串复制到dest中返回值dest的首地址方便调用参数dest复制后存放字符串的位置src需要复制的字符串strncpy--更安全的复制函数char *strncpy(char *dest, const char *src, size_t n)功能指定最多从src中复制n个字符到dest中返回值char *dest的首地址参数dest复制后存放字符串的位置src需要复制的字符串n最多从src中复制n个注意src长度 n --长度不足以 \0补充src长度 n --长度超出注意此时dest不是以\0结尾不是完整的字符串所以在使用strncpy是一般要自己手动在尾部写上\0示例char buf[10]; strncpy(buf, Hello,World!, sizeof(buf) - 1); buf[sizeof(buf) - 1] \0; 这里的字符串长度超出了数组长度手动加上\03.strcat--拼接字符串char *strcat(char *dest, const char *src)功能将src拼接到dest末尾覆盖dest的\0返回值dest的首地址方便调用参数dest拼接字符串的前部分拼接后的字符存放在dest中原本的dest被修改了src拼接字符串的后部分strncat--更安全的拼接函数char *strncat(char *dest, const char *src, size_t n);功能指定最多从src中取n个字符拼接到dest的末尾n dest剩下的空间并且要留出一个字节给\0从上面2个拼接函数strcat和strncat这2个拼接函数比较不好使用因为其存在的限制较大很容易出现字符串不完整的情况使用场景中有更好的替代方法--snprintf看下面第三部分4.strcmp--比较字符串int strcmp(const char *str1, const char *str2);功能按照ASCII表比较两个字符串str1和str2 非常好用返回值02个字符串完全相同0str1的同位字符 str2的同位字符0str1的同位字符 str2的同位字符参数str1 str2--需要比较的2个字符串str1 hello; str2 hello; if(strcmp(str1, str2) 0) { printf(这两个字符串相同); }二.搜素操作1.strchr--在字符串中搜索指定的字符char *strchr(const char *str, int ch);功能从str中寻找ch第一次出现的位置返回值找到返回ch在str中第一次出现的位置失败NULL参数str被寻找的字符串ch需要寻找的字符#include stdio.h #include string.h int main(void) { const char *str hello; char ch l; char *p_ch strchr(str, ch); printf(找到的字符为%c\n, *p_ch); printf(l出现在str的第:%ld位, p_ch - str); return 0; } /*运行结果:3*/2.strrchr--从字符串的末尾开始寻找指定的字符char *strrchr(const char *s, int c);#include stdio.h #include string.h int main(void) { const char *str hello; char ch l; char *p_ch strrchr(str, ch); printf(找到的字符为%c\n, *p_ch); printf(l出现在str的第:%ld位, p_ch - str); return 0; } /*运行结果:4*/3.strstr--在字符串中搜索指定的子字符串char *strstr(const char *haystack, const char *needle);功能从haystack中寻找needle第一次出现的地方返回值找到返回needle在haystack中第一次出现的位置失败NULL参数haystack被寻找的字符串needle需要寻找的子字符串#include stdio.h #include string.h int main(void) { const char *haystack hello; const char *str llo; char *p strstr(haystack, str); printf(%s\n, p); return 0; } 运行结果llo三.分割与拼接操作1.sscanf--按指定格式获取字符串int sscanf(const char *str, const char *format, ...)功能从str中按照指定格式读出数据类比scanf但是不是从屏幕中读取而是字符串返回值成功读取并赋值的参数个数参数str目标字符串format变参跟scanf的输入相同int main(void) { const char *str 1998-helloworld-18.1; int year; float num; char strs[20] {0}; sscanf(str,%d-%[^-]-%f, year, strs, num); printf(%d, %s, %f\n, year, strs, num); return 0; } 运行结果1998, helloworld, 18.100000 2.strtok--按指定的分隔符获取子字符串char *strtok(char *str, const char *delim);功能根据delim的字符分割str返回值返回每次切割成功后的子字符串参数str需要切割的字符串delim切割的标志字符串可以有多个切割标志如 \.有三个 仅空格一个#include stdio.h #include string.h int main(void) { char str[50] 1998-hello world-18.1; char *tmp strtok(str, - .); while(tmp ! NULL) { printf(%s\n, tmp); tmp strtok(NULL, - .); } return 0; } 运行结果:1998 hello world 18 1 代码含义:以 - .为分割注意1.strtok会修改原来的字符串str所以str必须是可修改的const 或者 char *str都不行2.在第一次切割的时候需要传入str的地址后续的切割需要改为NULL,不然会一直输出相同的数据3.sprintf--按指定的格式格式化拼接字符串#include stdio.h int sprintf(char *str, const char *format, ...);功能按照指定格式将字符串存入str中返回值成功写入的字符个数不包含\0参数str存放格式化后的字符串format格式化字符串等同于printf的使用但是格式化后的数据不打印在屏幕上而是存到数组中#include stdio.h #include string.h int main(void) { char str[50] {0}; int y 2026, m 7, d 21; sprintf(str, %d-%d-%d, y, m, d); printf(%s\n, str); return 0; } 运行结果2026-7-21能用于将不同类型的数据格式化后转为字符串非常好用四.内存操作函数为什么要提到内存操作函数内存操作函数能够更灵活的对数据进行操作上述的字符串函数只局限在字符串内以\0作为结束条件而内存操作函数能够对任意类型的数据进行操作1.memcpy--复制指定的字节个数到指定的内存#include string.h void *memcpy(void *dest, const void *src, size_t n);功能将n个src中的数据复制到dest中注意这里的都是void*说明支持任意相同类型的数据返回值dest的内存地址参数dest目标位置的地址src源数据的地址n需要复制的字节数这类内存相关的函数常用于数组字符串结构体截取部分数据#include stdio.h #include string.h struct Student{ char name[20]; int grade; int phone; int code; }std; int main(void) { struct Student std1 {xiaoming, 99, 123456, 1}; struct Student std2 {0}; memcpy(std2, std1, sizeof(struct Student)); //注意这的参数是地址 printf(%s, %d, %d, %d\n,std2.name, std2.grade, std2.phone, std2.code); return 0; } 运行结果xiaoming, 99, 123456, 12.memset--向指定内存写入指个数的数据void *memset(void *s, int c, size_t n);功能向指定内存写入指定个数的数据返回值s的内存首地址参数s需要填充的地址c要填充的值以int传递但是会转为unsigned charn要填充的字节数#include stdio.h #include string.h int main(void) { int buf[5] {8,5,3,2,1}; for(int i 0; i sizeof(buf) / sizeof(int); i) printf(buf[%d]:%d , i, buf[i]); printf(\n); memset(buf, 0, sizeof(buf)); for(int i 0; i sizeof(buf) / sizeof(int); i) printf(buf[%d]:%d , i, buf[i]); printf(\n); } 运行结果 buf[0]:8 buf[1]:5 buf[2]:3 buf[3]:2 buf[4]:1 buf[0]:0 buf[1]:0 buf[2]:0 buf[3]:0 buf[4]:0 五.其他操作函数1.atoi--字符串转intint atoi(const char *str)功能将字符串转为整数返回值成功返回转换后的整数值失败0参数str需要转化的字符串#include stdio.h #include stdlib.h int main(void) { char str[] 119; //直接转 char str1[] 122;//支持跳过空格 char str2[] 345; //支持识别正号 char str3[] -555; //支持识别负号 char str4[] 245abc; //遇到非数字停止 printf(%d\n,atoi(str)); printf(%d\n,atoi(str1)); printf(%d\n,atoi(str2)); printf(%d\n,atoi(str3)); printf(%d\n,atoi(str4)); return 0; } 运行结果:119 122 345 -555 245 注意atoi无法区分错误和0当错误时会返回02.atol--字符串转long#include stdlib.h long atol(const char *str);功能将字符串转为long型返回值成功返回转换后的long值失败0参数str需要转化的字符串#include stdio.h #include stdlib.h int main() { char str1[] 123456789; char str2[] -987654321; char str3[] 0; long num1 atol(str1); long num2 atol(str2); long num3 atol(str3); printf(%ld\n, num1); // 输出: 123456789 printf(%ld\n, num2); // 输出: -987654321 printf(%ld\n, num3); // 输出: 0 return 0; } 运行结果123456789 -987654321 0 与atoi对比对比项atoiatol返回值类型intlong取值范围32位-21亿 ~ 21亿64位-922亿亿 ~ 922亿亿错误处理返回 0返回 0适用场景小数字大数字3.atof--字符串转double#include stdlib.h double atof(const char *str)功能将字符串转为double型返回值成功返回转换后的double值失败0.0参数str需要转化的字符串#include stdio.h #include stdlib.h int main() { printf(%f\n, atof( 3.14)); // 3.140000忽略前导空格 printf(%f\n, atof(6.28)); // 6.280000支持正号 printf(%f\n, atof(-9.87)); // -9.870000支持负号 printf(%f\n, atof(.123)); // 0.123000无整数部分 printf(%f\n, atof(123.)); // 123.000000无小数部分 printf(%f\n, atof(1.23e-4)); // 0.000123科学计数法 printf(%f\n, atof(2.5abc)); // 2.500000遇到非数字停止 printf(%f\n, atof(abc)); // 0.000000无法转换 printf(%f\n, atof()); // 0.000000空字符串 printf(%f\n, atof( )); // 0.000000只有空格 printf(%f\n, atof( 1 2)); // 0.000000两个数字之间空格 return 0; } 运行结果 3.140000 6.280000 -9.870000 0.123000 123.000000 0.000123 2.500000 0.000000 0.000000 0.000000 1.000000 可以看到atof可以转化小数也可以识别科学计数法也能跳过空格情况处理方式示例前导空白字符跳过空格、制表符等 123→123.0正负号支持和--45.6→-45.6整数部分转换123→123.0小数点识别小数部分3.14→3.14科学计数法支持e或E1e3→1000.0非数字字符遇到即停止12.5abc→12.5无有效数字返回0.0abc→0.0

相关新闻

拆刀盾盲盒:游戏模型自动化提取工具部署与实战指南

拆刀盾盲盒:游戏模型自动化提取工具部署与实战指南

这次我们来看一个名为“拆刀盾盲盒”的项目。从名称上看,它很可能是一个与游戏、模型或数字资产相关的工具或流程,其核心玩法在于“拆解”和“盲盒”的结合,可能涉及对特定模型(如游戏角色、武器模型)的解析、提取或批…

2026/9/29 8:13:59 阅读更多 →
数据主权时代:私有化部署即时通讯如何成为企业协作新底座

数据主权时代:私有化部署即时通讯如何成为企业协作新底座

企业把沟通搬到线上之后,真正被改变的不只是交流方式,更是数据的流向。项目讨论、客户资料、研发文件与经营决策不断汇入IM,系统部署在哪里,便决定了这些信息由谁掌控。私有化部署因此从技术选项走向经营命题。2026年,…

2026/9/30 12:48:10 阅读更多 →
Shardingsphere5分库分表

Shardingsphere5分库分表

分库分表 垂直分库:按业务拆。把不同的表放到不通的数据库中。 水平分库:同一张表拆成多个表,放到不同的库中(相同表结构的数据库就是水平分表)。 水平分表:一张表拆数据行(把一张表横着拆成…

2026/10/13 23:58:38 阅读更多 →

最新新闻

Grad-CAM原理解析与工业级实现指南

Grad-CAM原理解析与工业级实现指南

1. 这不是“画个热力图”那么简单:Grad-CAM到底在解决什么问题?Grad-CAM可视化,这五个字最近在模型可解释性讨论里出现频率极高,但很多人一上手就卡在“为什么我的热力图全是噪点”“为什么关键区域没亮起来”“为什么不同层的图完…

2026/10/15 15:22:08 阅读更多 →
Vue3源码解析:从effect看watch与computed的设计与调度

Vue3源码解析:从effect看watch与computed的设计与调度

Vue 3 的watch和computed这两条 API,可能是绝大多数项目里使用率最高的响应式能力,但也是误解最多的一对。平时查资料,大家见到的多半是用法层面的总结:computed 用于同步派生状态、watch 用于执行副作用、能用 computed 就别用 w…

2026/10/15 15:22:08 阅读更多 →
碰碰好评卡功能模块开发实战指南 附全流程实现思路与踩坑汇总

碰碰好评卡功能模块开发实战指南 附全流程实现思路与踩坑汇总

碰碰好评卡功能模块开发实战指南 附全流程实现思路与踩坑汇总 在电商、本地生活、上门服务等各类线上业务场景中,用户评价是影响商品/服务转化的核心指标,碰碰好评卡作为引导用户主动完成评价的核心功能模块,需要兼顾触发灵活性、多端兼容性、…

2026/10/15 15:22:08 阅读更多 →
ZooKeeper核心机制精讲:数据模型、Watch与Leader选举

ZooKeeper核心机制精讲:数据模型、Watch与Leader选举

1. 为什么分布式系统里必须有ZooKeeper这样的角色早些年我做分布式系统的时候,最头疼的事情不是接口怎么写,而是几台机器之间怎么“商量事儿”。比如一个服务一共开了三个实例,数据库连接池一共 60 个连接,分配 30 个给 A、20 个给…

2026/10/15 15:22:08 阅读更多 →
okhttputils 使用指南:基于 OkHttp 3.3.1 的 Android 网络请求封装库完整实战

okhttputils 使用指南:基于 OkHttp 3.3.1 的 Android 网络请求封装库完整实战

网络移动开发 【免费下载链接】okhttputils [停止维护]okhttp的辅助类 项目地址: https://gitcode.com/gh_mirrors/ok/okhttputils 点击查看 免费下载 本文是一份围绕开源仓库 okhttputils 的完整使用指南。okhttputils 是一套对 Square OkHttp 的辅助封装类&#…

2026/10/15 15:22:08 阅读更多 →
基于单片机的电阻炉温控系统:DS18B20与PID调参实战

基于单片机的电阻炉温控系统:DS18B20与PID调参实战

简介:基于单片机的电阻炉温控制系统设计,是一套面向电子、自动化专业学生及嵌入式初学者的完整课程设计/毕设方案,涵盖DS18B20数字测温、单片机温度曲线动态跟踪和上位机通信三大环节。方案从硬件原理图、下位机控制程序到VB上位机界面均有实…

2026/10/15 15:21:06 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →