✋三、长度不限制的字符串函数
1.strncpy
strncpy与strcpy相比较多了一个字母n
,这个n代表的是需要拷贝字符的个数
,也就是说strncpy需要关注拷贝字符的个数
,而不是像strcpy那样关注’\0’。
举例:
算法图解分析:
char* strncpy(char* destination,const char* source,size_t num);
头文件:string.h
函数名:strncpy
函数参数:
【参数1】destination,类型:char*,拷贝字符的目的地位置,即接收字符的起始位置
【参数2】source,类型:char* ,拷贝字符的源地址,即拷贝字符串的开始位置。
【参数3】num,类型size_t,拷贝字符的个数,用来控制拷贝字符的长度。
函数返回类型:char* ,返回接收字符的起始位置。
函数功能:指定个数的字符串拷贝
重点内容
(1)Copies the first num characters of source to destination.lf the end of the source C string(which issignaled by a null - character) is found before num characters have been copied, destination is paddedwith zeros until a total of num characters have been written to it.
(2)拷贝num个字符从源字符串到目标空间。
(3)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
(4)如果拷贝的字符长度大于目的地空间的容量,则会破坏dest字符串后面的\0,要避免这种情况发生
模拟实现strncpy
2,strncat
strcat函数是字符串追加,在使用的时候以src的’\0’作为追加结束标志,因此在使用strcat来追加一个字符串数组本身的时候,会因\0被提前覆盖而无法追加成功。
strncat与strcat相比多了一个字母n,这个n代表的是需要追加字符的个数,也就是说strncat需要关注追加字符的个数,而不是像strcat那样关注’\0’。
strncat在追加字符串的时候,会自动在末尾处添加字符串结束标志’\0’。(这也是我们在追加的时候,不用关注原dest, src中’\0’,仅需关注追加字符的个数的原因)
strncat在追加字符串的时候,会自动在末尾处添加字符串结束标志’\0’。(这也是我们在追加的时候,不用关注原dest, src中’\0’,仅需关注追加字符的个数的原因)
算法图解分析:
情况二程序演示效果:
char* strncat(char* destination,const char* source,size_t num);
头文件:string.h
函数名:strncat
函数参数:
【参数1】destination,类型:char*,被追加字符的目的地位置,即接收追加字符的起始位置
【参数2】source,类型:char* ,追加字符的源地址,即追加字符串的开始位置。
【参数3】num,类型size_t,追加字符的个数,用来控制追加字符的长度。
函数返回类型:char* ,返回接收字符的起始位置。
函数功能:指定个数的字符串追加
重点内容:
(1)Appends the first num characters of source to destination, plus a terminating null - character.
(2)lf the length of the C string in source is less than num, only the content up to the terminating null - character is copied.
(3)如果追加的字符长度大于目的地空间的剩余容量,则出现越界访问,要避免这种情况发生。
模拟实现strncpy
3.strncmp
strcmp用来比较两个字符串的大小,其算法思想如下:
而strncmp与strcmp相比多了一个字母n,这个n代表的是需要比较字符的个数,也就是说strncmp需要关注比较字符的个数,而不是像strcmy那样仅关注’\0’。
strncmp的返回结果与strcmp一样,返回 > 0, == 0, < 0 的整数。
以下面代码为例:
算法图解分析:
int strncmp(const char* p1,const char* p2,size_t count); 头文件:string.h
函数名:strcmp
函数参数:
【参数1】p1,char* 类型,表示用来比较的其中一个字符串。
【参数2】p2,char* 类型,表示用来比较的另一个字符串。
【参数3】count,size_t类型,表示参与比较的字符个数。
函数返回类型:int类型,根据比较的具体结果返回相应的数值
Exit :
returns <0 if str1 < str2
returns =0 if str1 == str2
returns >0 if str1 > str2函数功能:
Compares two strings for ordinal order.The comparison stops after :
(1) a difference between the strings is found,
(2) the end of the strings is reached, or
(3) count characters have been compared.
重点内容:
(1)比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
库函数参考:
⚾四、字符串查找
1.strstr
查找字符串,找子字符串
找到字符串返回的是子字符串的地址,找不到返回空指针。
算法图解分析:
char* strstr(const char* str1, const char* str2);
头文件:string.h
函数名:strstr
函数参数:
【参数1】str1,char ,用于查找字符串的母串。*
【参数2】str2,char,待查找字符串的子串。*函数返回类型:char* ,返回查找到的地址
函数功能:查找字符串 / 找子字符串
重点内容:
(1)
如果在str1中查找了字串str2,则返回str1中字串str2的起始地址
(2)
如果查找不到,返回空指针NULL
(3)如果str1中含有多个str2字串内容,返回的是第一个被查找到的str2起始地址
模拟实现strstr:( KMP算法
)
其实库函数的实现逻辑跟我们实现的方式是一样的,两者有所区别的是代码风格,库函数的代码风格更
加简练,需要有一定的编程功底!
库函数源代码参考:
2.strtok
char* strtok (char* str, const char* sep);
头文件:string.h
函数名:strtok
函数参数:【参数1】str,要被分割的字符串起始位置 【参数2】sep,被用于分割的字符集合起始位置
函数返回类型:char* ,标记的位置
函数功能:字符串分割
详解:
(1)sep参数是个字符串,定义了用作分隔符的字符集合(2)第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
(3)
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。
(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)(4)
strtok函数的第一个参数不为(NULL),函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
(5)
strtok函数的第一个参数为(NULL),函数将在同一个字符串中被保存的位置开始,查找下一个标记。
(6)如果字符串中不存在更多的标记,则返回NULL指针。
应用举例: