C常用字符串操作

概述

考试时字符串相关的题目,涉及的知识面非常广,可能会用到栈、队列、链表等数据结构,各种算法都可能涉及,因此,大多数的字符串题目其根本的考点并不是字符串操作。但是掌握字符串基本操作是解答这些题目的前提,一般这些题目都涉及字符串的解析,分割,格式化。下面先回顾下常用字符串操作函数及其功能,再通过一些leecode题目来实际使用。

字符函数

需要包含头文件ctype.h,所有字符函数入参类型都是int,实际传入char即可;isxxx函数的返回值类型是int,实际是bool;toxxx函数返回值类型是int,实际是char。
函数 功能描述
int isalnum(int ch) 是否为字母和数字[A-Za-z0-9]
int isalpha(int ch) 是否为字母[A-Za-z]
int iscntrl(int ch) 是否为控制字符ASCII码0~0x1F以及0x7F
int isdigit(int ch) 是否为数字[0-9]
int isgraph(int ch) 除空白字符外的所有可打印的字符
int islower(int ch) 是否为小写[a-z]
int isupper(int ch) 是否为大写[A-Z]
int isprint(int ch) 是否为可打印的字符
int ispunct(int ch) 是否为标点符号(除alnum和空白外的所有可打印字符)
int isspace(int ch) 是否为空白字符( , \t, \v, \f, \r, \n)
int isxdigit(int ch) 是否为16进制数字[A-Fa-f0-9]
int tolower(int ch) 转小写,如果ch不是大写返回值与ch相同
int toupper(int ch) 转大写,如果ch不是小写返回值与ch相同
/)

字符串函数

需要包含头文件string.h

字符串解析的方法有很多,对于类似于解析整数,浮点数之类的,可以使用下一节“字符串转换”中列出的函数。对于一些复杂的解析,就需要自己遍历字符串逐个字符检查处理。
一般遍历字符串使用while循环:
char *p = s;
while (*p != ‘\0’) {
// do something
p++;
}
用while循环代码会长一点,有时可能忘记最后一行的p++,使用for循环可以减少这种风险。上面while循环等价的for循环如下:
for (char *p = s; *p != ‘\0’; p++) {
// do something
}
有时我们可能更需要每个字符的索引,这时的for循环可以这样写:
for (int i = 0; s[i] != ‘\0’; i++) {
// do something

字符串转换

函数 功能描述
int atoi(const char *str) 等价于scanf(str, “%d”, &i) //字符串转整数
long atol(const char *str) 等价于scanf(str, “%ld”, &l)
double atof(const char *str) 等价于scanf(str, “%lf”, &d)
int sscanf(const char *buffer, const char *format, …) 可以使用%d, %ld, %f, %lf等将buffer开始处的数字转换成对应类型的值,返回转换成功的参数个数
long strtol(const char *start, char **end, int base) 比atol返回的信息多一些
unsigned long strtoul(const char *start, char **end, int base) 与strtol类似
double strtod(const char *start, char **end) 与strtol类似

字符串查找

函数 功能描述
char *strchr(const char *str, int ch) 返回指向str中第一个ch位置的指针,未找到返回NULL
char *strrchr(const char *str, int ch) 返回指向str中最后一个ch位置的指针,未找到返回NULL
char *strstr(const char *str1, const char *str2) 返回指向str1中第一个str2位置的指针,未找到返回NULL
size_t strcspn(const char *str1, const char *str2) 返回指向str1中第一个在str2中出现的任意一个字符的指针
size_t strspn(const char *str1, const char *str2) 与strcspn相反
char *strpbrk(const char *str1, const char *str2) 与strcspn功能相同,只是返回值为指针

字符串比较

函数 功能描述
int strcmp(const char *str1, const char *str2) 逐个比较,直到遇到不相同的字符,返回这两个字符的差值
int strncmp(const char *str1, const char *str2, size_t count) 最多比较count个字符,不用担心两个字符长度不足count的情况
int stricmp(const char *str1, const char *str2) 忽略大小写的比较
int strcoll(const char *str1, const char *str2) 与strcmp类似,只是比较时会根据当前的区域设置(setlocale),将一些相同但编码不同的字符视为相等

字符串拼接

函数 功能描述
char *strcat(char *str1, const char *str2) 把str2拼接到str1结尾,返回str1,会添加\0
char *strncat(char *str1, const char *str2, size_t count) 最多把str2中count个字符拼接到str1结尾,会添加\0,不用担心str2长度不足count的情况
int sprintf(char *buffer, const char *format, …) 可以用%s把字符串放入buffer中,返回值为放入buffer中的字符个数,所以可根据返回值偏移buffer,再次调用sprintf实现拼接,效率比strcat高。

字符串拷贝

函数 功能描述
char *strcpy(char *to, const char *from) 拷贝字符串,包含\0,返回to
char *strncpy(char *to, const char *from, size_t count) 最多拷贝from中的n个字符到to中,不会添加\0,除非from的长度小于count

字符串分割

C标准库的字符串分割函数为:char *strtok(char *str1, char *str2),str2为分割符,如果str2中不止一个字符,则str2中的每个字符都是分割符,当str1不为NULL时,strtok从str1中找到第一个分割符,将其替换为’\0’,并返回str1,再次调用时str1必须传入NULL,这时strtok从上一次分割符后的位置查找下一个分割符,并将其替换成’\0’,如果没有找到分割符,则返回NULL。
从这个函数的功能来看,它肯定使用了全局变量或静态局部变量,所以这个函数是不可重入的,多个线程同时调用时就会出现问题。为了解决这个问题,VC引入了strtok_s,Linux引入了strtok_r,这两个函数原型都一样:char *strtok_s(char *str, const char *delims, char **context),这个仍然是直接修改源字符串,只是需要调用者使用一个context指针保存本次分割完成后下一次分割开始位置,后续调用时str传入上次返回的context即可。
使用方法:
char src[] = “this is an example”;
char *context = src, *p;
while ((p = strtok_s(context, “ “, &context)) != NULL) {
printf(“%s\n”, p);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值