引言


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

实战练习: