引言
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
实战练习: