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

实战练习:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值