不要怀疑,博主这次真的是在挖坟,今天整理笔记的时候才看见,所以呢,就上来备份一下,这篇呢主要是说一些关于字符串函数的知识点,希望大家以后在使用的时候注意一下!
一、字符串基本知识
1.字符串:顾名思义,字符串即一串字符的组合,并且以NUL结尾,所以我们不能让‘\0‘出现在字符串还 没有结束的地方。
2.NUL:它本身并不是字符串的一部分而是一个我们用来判断一个字符串结束与否的标识!
3.字符串的分类:常量字符串,字符串数组。
- 常量字符串
一般来说我们使用常量字符串来保存那些不需要被修改的字符串
- 字符串数组
存放在数组里的字符串我们可以对其进行增删和替换
注意:若我们要使用字符串函数必须引头文件string.h
二、串操作函数
1、字符串的长度度量标尺:strlen
函数原型:size_t strlen(char const *string)
size_t是一个无符号整数类型 所以我们不可以用两个strlen 的结果减法运算来判断哪个字符串长。
典型错误:if((strlen(str1)-strlen(str2)) >= 0) 该表达式的结果将永远为真
**表达里面如果同时包含有符号和无符号数结果会变得不一样
使用减法必须强类型转换
int main ( ) { char *arr = "ABCD"; int ret1 = strlen( arr ); int ret2 = strlen( arr ) - 10 ; printf( "%d %d\n" , ret1, ret2 ); system( "pause" ); return 0 ; }
结果: 4 -6
2.容易失控的不受长度限制串操作函数
- 字符串拷贝函数strcpy
由于字符串拷贝函数不能检测字符串的长度,你给它多少个字符它就拷贝多少个字符,但在程序执行时,多出来的字符会按顺序存放在内存空间中,这样是十分不安全的,你有可能覆盖掉了内存中其他重要的信息。
当原串和目标串出现内存重叠的时候我们应该考虑原串里面的内容会被覆盖并丢失,此时我们应该选择内存拷贝函数memmove来解决这个难题
如果新的字符串短于原字符串那么原字符串里结尾的几个字符也无法显示,因为在拷贝时它将字符串里的‘\0’也一起拷贝过来,导致原串中最后几个字符落在NUL的后面!
- 字符连接函数strcat
strcat函数同样不受到长度的限制,我们在将一个字符连接到另一个字符串后面的时候选择strcat函数,在我们使用时同样要给目标字符串预留出足够的空间来容纳我们的源串,并且保证它们不会发生内存的重叠。
如果你需要连接的字符串的长度加上目标字符串的长度超过了目标串的总长则会发生段错误!
不能自己连接自己!
- 字符串的比较函数strcmp
字符串的比较函数strcmp的原理是将字符串里的每一个对应字符进行比较,直到找到第一个不相等的字符比较他们的ASCII码值后给出结论!
被比较的两个字符串可以长度不同,如果前面的字符都相同,那么短的那个字符串更小!
有一个常见的问题,许多的初学者总是将判断条件写成if(strcmp(str1,str2))这种写法是绝对要避免的,因为该函数的返回值为0时,结果为真(str1=str2),正好和我们平时的逻辑相反!
以上叙述的三个函数都是不受字符串的长度限制,在使用时一定要注意不要忽略可用的字符串的长度(避免字符串数组的越界访问造成的内存覆盖丢失等)
3.长受限的串操作函数
- strncp(char *dest,const char *src,int n)
该函数在复制时根据传参时规定的长度复制字符串,如果src的长度小于n那么数组将在未填充部分自动填充NUL来补全,但如果src的长度大于n那么src只会有n个字符被复制,并且该字符串不会以NUL结尾
- strncat(char *dest,const char *src,int n)
该函数在连接时,如果连接之后字符串总长大于dest能容纳的最大长度src函数不会停止而是将后面的连接上去,并且在连接完最后个字符之后添加上NUL
- strncmp
以上三个函数的功能和我们刚刚介绍过的strcpy,strcat,strcmp的功能主要的差别就是在长度的控制上
3.字符串查找函数
- 查找一个字符
我们常常使用strchr和strrchr来查找字符串里某个字符的位置
strchr找到该字符第一次出现在该串中的位置,并返回指向它的指针。
strrchr找到该字符最后一次出现在该串中的位置,并返回指向它的指针。
- 查找任意几个字符
strpbrk(char const *str,char const *group);
值得注意的是:如果输入了一个任意几个字符其中第一个字符存在于字符串里,但是后面的不存在它仍然会给你返回指向第一个字符的位置的指针~
返回原串中第一次出现的目标串的任意字符的地址
匹配任何一个字符
int main ( ) { char *arr = "ABCD"; char *ret = strpbrk( arr,"BF" ); printf( "%c\n" , *ret ); system( "pause" ); return 0 ; }
- 查找子串strstr(const char *str,const char *str2)
库函数里并没有像strrstr这样的函数,但我们可以自己实现它!该函数也是用于在字符串里查找子串不和上面函数不一样的是如果子串没有完整的出现在原串里它将返回NULL
拓展:实现strrstr 出现一次截断一次
int main ( ) { char *arr = "ABCD"; char *ret = strstr( arr,"BF" ); printf( "%c\n" , *ret ); system( "pause" ); return 0 ; }
4.高级查找字符串
- 查找一个字符串前缀
strspn(const char *str,const char *group);
strcspn(const char *str,const char *group);
group指定了一个或者多个字符。strspn返回str起始部分匹配group里任意字符的字符数,如果str离包含空格和制表符那么这个函数将返回str其实部分空白字符的数目
而strcspn正好与之相反的计算了不匹配的字符数目一旦出现相等的就不统计了!!
下面的代码将计算指向第一个非空白字符的指针的值:char *ptr=buffer+strspn(buffer,"\n\r\t\v");
- 查找标记
找到第一个标记并将它置成NULL 保存它的位置并且下次从上次保存的位置开始找下一个标记。
- 提取表及