字符串函数 String Function
C语言自带的头文件string.h
中包含了一些常用字符串函数原型,合理利用它们将有助于弥补C在字符串处理方面的不足。
STR-FUNC-1 检查字符串长度的strlen()
库函数strlen()
的函数原型:
size_t strlen(char const *string)
它接受一个指向字符串起始位置的指针,再返回其长度。
注意到此处strlen()
的返回值类型是size_t
,这不是C的基本数据类型,它在头文件stddef.h
中被定义。只需要将其看作是无符号整数unsigned int
进行使用即可。
STR-FUNC-2 复制与连接
对于在多个字符串上进行操作,我们常常需要复制一个字符串到另一处:使用strcpy()
。(函数名是 string copy 的简写)
char *strcpy(char *dst,const char *src);//它的返回值是dst的一个副本
src
是指向源字符串的指针,该函数进行复制并包含结尾的\0
。因此dst
位置的内容将会被覆盖或不再可以访问。
strcpy
的一大缺陷是它无法得知源字符串能否被放入dst
中。如果dst
中的可用空间太少,其结果是未定义的,所以一定要保证dst
位置由足够存放的空间。
如果实在无法确定src
的长度,可以使用更加安全的strncpy()
,它额外接受一个无符号整数用于限制其最大复制长度。
char *strncpy(char *dst,const char *src,size_t len);
size_t len
规定了最大复制字符的数量,包括其中的\0
。如果src
处的字符串中字符个数少于这个值,剩余的空位将会以\0
自动填充。注意:如果src
处的字符串中字符个数多于这个值,只有一部分会被复制,而更糟的是极可能得到一个不含结尾\0
的字符串。
如前所述,复制字符串将覆盖原有的内容。除此之外我们还能用strcat()
来连接一个字符串到另一个的结尾。
char *strcat(char *dst,const char *src);//它的返回值是dst的一个副本
strcat()
将会先找到dst
处字符串的末尾\0
,再进行一次复制src
的操作。
长度受限的版本:
char *strncat(char *dst,const char *src,size_t len);
STR-FUNC-3 字符串比较
字符串是由char
组成的。那么应该如何比较两个字符串的“大小”?
下面请看strcmp()
的原型:
int strcmp(char const *s1,char const *s2);
s1
和s2
是两个将进行比较的字符串,strcmp()
函数会查找它们其中第一个不一样的字符,然后根据字符的字符集序数进行比较,并且只会比较这一个字符就输出结果。如果前者s1
小于后者s2
,则返回一个小于0的值;前者大于后者,则返回一个大于0的值;相等时返回0。
实际上,这个函数最经常见到的用处是判断两个字符串是否相等。
STR-FUNC-4 在字符串中查找
strchr()
,strrchr()
查找一个匹配的字符:
char *strchr(char const *str,int ch);
char *strrchr(char const *str,int ch);
ch
即为需要在str
中查找的目标字符。有趣的是ch
是int
型,但只需要向它传递一个字符即可。
返回值是一个指向第一个匹配目标字符的指针。如果未找到则返回NULL
。
strrchr()
函数原型相同,但它的返回值是指向字符串中最后一个出现的匹配目标字符的指针。
strpbrk()
则是在一个字符集合中查找目标字符:
char *strpbrk(char const *str,char const *group);
返回值是指向第一个在集合中出现的字符指针。如果未找到,返回值是NULL
。
strstr()
在一个字符串中查找另一个字符串(又叫子串):
char *strstr(char const *str,char const *s);
这个函数将在str
中查找s
第一次完整出现的位置,并返回指向第一次出现的起始位置的指针。如果s
未完整出现则返回NULL
,如果s
是空字符串则返回str
本身。
**strspn
和strcspn
会对字符串前面的一部分进行计数。**依托于一个字符集合,从字符串开头处计数匹配目标字符集合的字符,直到遇到第一个不匹配的字符为止,返回起始部分的对应字符数量。
size_t strspn(char const *str,char const *group);
size_t strcspn(char const *str,char const *group);
strspn()
返回str
起始部分匹配group
中任意字符的字符数量。
恰恰相反,strcspn()
返回的是起始部分不匹配group
的部分。遇到相匹配的字符时,会停止计数。
strtok()
函数的用法比较抽象,它的作用是“分割”一个字符串。
在哪里进行分割?sep
参数会给出用作分隔符的字符集合。
char *strtok(char *str,char const *sep);
函数从str
开始查找sep
中包含的分隔符,直到在str
字符串中遇到sep
中任意一个分隔符,将其修改(会修改str
,这也是为何此处str
形参并没有作为const
量)为一个\0
,然后返回一个指向已经分割好的子字符串的指针。
**与此同时strtok()
函数会立即存储此字符串中改变了的位置。**在此之后,如果想要继续对str
的后续部分进行分割,只需要向此函数的第一个形参传递一个NULL
即可继续在str
后面进行分割。
当str
中所有内容都已经被分割了,函数的返回值将变为NULL
,以表示它已经无事可做。例如:
token = strtok(str, delimiters); //先获取一个子字符串,并使strtok保存分割了的位置
// 继续获取其他子字符串
while( token != NULL ) {
printf( " %s\n", token );
// 注意:这里需要传递 NULL 来获取下一个子字符串
token = strtok(NULL, delimiters);
}
一揽子名字奇奇怪怪的这些函数我也记不住啊,明天争取再写一个函数应用篇吧
本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ