不要怀疑,博主此次真的是在挖坟,今天整理笔记的时候才看见,因此呢,就上来备份一下,这篇呢主要是说一些关于字符串函数的知识点,但愿你们之后在使用的时候注意一下!
数组
1、字符串基本知识
1.字符串:顾名思义,字符串即一串字符的组合,而且以NUL结尾,因此咱们不能让'\0'出如今字符串还 没有结束的地方。
2.NUL:它自己并非字符串的一部分而是一个咱们用来判断一个字符串结束与否的标识!
3.字符串的分类:常量字符串,字符串数组。安全
常量字符串ide
通常来讲咱们使用常量字符串来保存那些不须要被修改的字符串函数
字符串数组spa
存放在数组里的字符串咱们能够对其进行增删和替换
注意:若咱们要使用字符串函数必须引头文件string.h
2、串操做函数
一、字符串的长度度量标尺: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的后面!string
字符链接函数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 保存它的位置而且下次从上次保存的位置开始找下一个标记。
提取表及