C学习:一网打尽字符串骚操作

引言


C语言中字符串的处理场景十分常见,字符处理也很琐碎。本文总结高频常用字符串操作函数、相关技巧及注意事项。

一些简单的字符串功能可手写代码实现,比如以下总结。

手动挡:手写代码实现

  • 小写转大写:char upCh = lowCh - 'a' + 'A';
  • 大写转小写:char lowCh = upCh - 'A' + 'a';
  • 字符转数字:int num = ch - '0';
  • 数字转字符:char ch = i + '0';

但是,更建议在了解其原理的基础上,多用自动挡——调库函数,尽量避免重复造轮子。

自动挡:库函数分类

  • 字符类型识别判断:数字、空白符、字母(大小写)
  • 字符串转换
  • 字符串拷贝
  • 字符串分割
  • 字符串拼接
  • 字符串查找
  • 字符串比较

下面对自动挡库函数分类进行总结。

字符类型判断


所在头文件:#include <ctype.h>

总结如下表:

函数名 功能描述 返回值 备注
isdigit 是否为数字[0-9] 返回非0,则是;返回0,则不是 宏函数
isalpha 是否为字母[A-Z, a-z] 返回非0,则是;返回0,则不是 宏函数
isupper 是否为大写字母[A-Z] 返回非0,则是;返回0,则不是 宏函数
islower 是否为小写字母[a-z] 返回非0,则是;返回0,则不是 宏函数
isalnum 是否为字母或数字[A-Z, a-z, 0-9] 返回非0,则是;返回0,则不是 宏函数

说明:isalpha 实质调用为 islower || isupper,也即大写或者小写的并集就是字母。

字符串转换


字符大小写转换

较为简单,也可以自己实现,库函数使用总结如下表。

函数签名 功能描述
int tolower(int ch) 转小写,如果ch不是大写返回值与ch相同
int toupper(int ch) 转大写,如果ch不是小写返回值与ch相同

字符与数值转换

所在头文件:

#include <stdio.h>
#include <stdlib.h>

sscanf/sprintf包含在stdio.h,列表中其余函数均包含在stdlib.h。掌握sscanf/sprintf即可,其余仅作了解。

字符串到数字的转换原理为:以整数为例,从高到低取每个字符与'0'相减,并不断乘10累加进位,最后得到的sum即为转换后的数字。

下文将字符串转换库函数总结如下。

函数名 功能描述 返回值 备注
sscanf 字符串转数字,灵活匹配任意整数类型 成功,则返回转换的数字个数;失败,返回-1 万能,可替代strtoi和atoi系列
strtol/strtoul/strtod 字符串转数字,对应long、unsigned long和double 成功,则返回转换后对应的数值;失败,返回0 三个参数,第二个二级指针,保留字符串截止指针,若空,则无效,最后一个为进制基数
atoi/atol/atof 字符串转数字,对应int、long和double 成功,则返回转换后对应的数值;失败,返回0 仅一个参数,无基数
itoa/ltoa/ultoa 数字转字符串,int数值转str 不用掌握 三个参数,第一个为待转换数字,第二个为字符串地址,最后一个为进制基数;非标准库函数,仅windows特有
sprintf 数字转字符串,灵活匹配任意整数类型 成功,则返回转换后的字符串长度;失败,返回-1 万能

注意

  • sscanf取整数变量时,要用地址引用,因为要改变其值。
  • sprintf则用值传递,转换后拷贝给字符串。

举例

  • int i = atoi(str),可以用sscanf(str, "%d", &i)替代。
  • long l = strtol(str, NULL, 10),可以用sscanf(str, "%ld", &l)替代。
  • sprintf(str, "%ld", l),则将长整型l的值转换成字符,拷贝到字符串str中。

字符串必备操作


分析:字符串处理中,经过拷贝后,一般会做切割,再拼接起来,然后进行与目标字符串进行比较,实现查找等功能。

下面将字符串中拷贝/分割/拼接/查找/比较5个常用函数,总结如下表。

所在头文件:#include <string.h>

函数名 功能描述 返回值 备注
strcpy 字符串拷贝,末尾自动追加\0’ 成功,则返回转换的数字个数;失败,返回-1 相关函数strncpy,可拷贝指定长度字符串
strtok 字符串分割,第一次传待分割 成功,返回切割后的前部分字符串首地址;失败或结束时,返回NULL 有静态变量参与,原地修改字符串,不可重入
strcat 字符串拼接,在目标字符串末尾连上源字符串 成功,返回目标字符串起始地址;失败,返回NULL 末尾自动追加’\0’
strcmp 字符串比较,基于字典序 相等,返回0;a串在b串的后面,则返回>0;a串在b串的前面,则返回<0; 可用它构造个compare函数,结合qsort对字符串进行字典序排序
strstr 字符串查找,确认目标字符串中是否含有待查找的字符串子串 成功,返回目标字符串中首次出现的子串地址;失败,返回NULL 常用在字符串匹配及滑窗算法场景

说明:strtok的使用方法总结,见博客:C学习:常用字符串操作函数之strtok()和strtok_s()

注意事项


注意点:

  • ASCII码中,A是排在a前面的,A的数值比a小
  • 转义符如'\n''\t'等,只算一个字符
  • strcmp()相等时,返回值是0,不是1

实战练习:

C语言世界 文章被收录于专栏

C语言学习总结分享

全部评论

相关推荐

压力很大,面试官全程高压,问的问题不难,但是没有任何反馈,很慌张,也无算法。实习问了20分钟,一直问我你们做的有什么用,总时长一小时1.学校都有什么课程2.spring的ioc原理以及优点3.除了解耦还知道什么?4.springboot与spring区别,二者的源码看过没?Tomcat了解嘛?有没有具体看过5.spring的bean,面试官一直在重复一个思想问我懂不懂,完全没听过6.mybatis是干什么的?ibatis用过没?平常怎么写SQL?完全不写嘛?7.设计一个分布式双十一秒杀系统(前端,网关,缓存,数据库防超卖全设计)8.怎么做限流9.缓存与数据库一致性,你做异步要用户等你嘛?10.负载均衡怎么做11.多数据中心还是单数据中心,如果出现没卖完怎么做(到这完全不会了,面试官直接说换个话题吧)12.平常读书吗?13.上过哲学课嘛?14.兴趣爱好有没有15.对ai的看法16.来深圳有问题嘛?17.为什么不考研18.上大学带给了你什么?你提升在哪里,有没有具体的例子?反问:1.现在手机都有应用市场,应用宝怎么盈利?除了手机应用市场还是有人用,现在在做跨端,微软都有合作,之后会进军mac,主要做游戏,腾讯本身就是游戏大户。2.面试表现?整体评价一下会给到反馈。面完直接变HR面,今天HR面后,已经转为录用评估了,来牛客许个愿,暑期现在还没什么面试,希望能拿个offer之后再考虑要不要留在手子吧。
nunuking:三面压力这么大吗,面试的会议约了多长时间呀
面试问题记录
点赞 评论 收藏
分享
03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务