🌇个人主页:_麦麦_
📚今日感言:博客写多了,容颜自然改变,许多时候,自己可能以为许多写过的博客都成了过眼云烟,不复记忆,其实他们仍是潜在的。在气质里,在谈吐上,在胸襟的无涯,当然也可能显露在生活和文字里。
目录
一、前言
二、正文
3.长度受限制的字符串函数
★strncpy
★strncat
★ strncmp
4.字符串查找
★strstr
★strtok
一、前言
在麦麦的上一篇文章——字符函数和字符串函数(上),我们介绍了string.h库里常用的两种类型函数,分别是“求字符串长度函数”和“长度不受限制的字符串函数”这两大类,想必有些小伙伴们看完还是觉得不过瘾,那么接下来这一篇文章将为各位继续细致的为大家讲解剩下的字符函数和字符串函数。
二、正文
3.长度受限制的字符串函数
★strncpy
①函数介绍
char * strncpy(charr * destination, const char *source, size_t num);
● Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
●拷贝num个字符从源字符串到目标空间
●如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个。
●所引用的头文件"string.h"
//示例代码,帮助大家理解strncpy函数的使用
#include <string.h>
#include <stdio.h>
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";printf("%s",strncpy(arr1, arr2, 5));return 0;
}
②模拟实现
strncpy的模拟实现与strcpy函数的模拟实现大体相似,只是有了指定大小的字符拷贝,具体代码如下:
#include<stdio.h>
#include<string.h>
#include <assert.h>//strncpy模拟实现
char* my_strncpy(char* dest, const char* sorc, size_t num)
{assert(dest && sorc); //避免传来空指针char* tmp = dest;while (num && (*dest++= *sorc++)){num--;}while(--num){*dest++ = '/0';}return tmp;
}
//strncpy示例代码
int main()
{char arr1[20] = "";char arr2[] = "Happy new year!";my_strncpy(arr1, arr2, 5);printf("%s", arr1);return 0;
}
★strncat
①函数介绍
char * strncat(cahr * destination, const char * source, size_t num);
●功能:实现指定大小的字符串追加
● 详细介:1:Appends the first num characters of source to destination, plus a terminating null-character.
●详细介绍2:If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.
//示例代码,帮助大家理解strncat函数的使用
#include <string.h>
int main()
{char arr1[30] = "Welcome ";char arr2[] = "to my blog!xxxx";strncat(arr1, arr2, 11);return 0;
}
★ strncmp
int strncmp(const char * str1,const char * str2, size_t num)
●比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完
//示例代码,帮助大家理解strncmp函数的使用
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcde";char arr2[] = "acdef";printf("%d\n", strncmp(arr1, arr2, 1)); //打印出来为:0return 0;
}
4.字符串查找
★strstr
①函数介绍
char * strstr(const char *str1, const char * str2);
●功能:查找str1中是否存在str2
●返回值:有则返回第一个寻找到str2的内容位于str1的起始指针,无则返回空指针
●头文件:string.h
//示例代码,帮助大家理解strstr的使用
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdefbcd";char arr2[] = "bcd";char arr3[] = "adef";printf("%s %s\n", strstr(arr1, arr2), strstr(arr1, arr3)); //返回bcdedbcd (null)return 0;
}
②模拟实现
strstr模拟实现的思路:
⑴定义三个指针,分别是返回指针ret1,判断指针1 text1,判断指针 text2。
⑵ret指针用于返回,从str1的第一个字符开始,逐渐向后走,直到判断为所要寻找的字符串的首字符指针并返回该指针或是一直走到str1的‘\0’处,返回空指针
⑶判断流程:利用判断指针text1和text2,一一往后走并比较是否相等,如果不相等,就退出该ret指针所指向的字符的判断,进入下一字符的判断流程;若一直相等,直至text2指针所指向的字符为str2字符串的末尾结束标志'\0',则说明找到所寻字符串
具体代码实现如下:
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);char* ret = str1; //返回指针char* text1 = NULL; //判断指针1char* text2 = NULL; //判断指针2while (*ret){text1 = ret; //判断指针1回归text2 = str2; //判断指针2回归while (*text2++==*text1++) //判断是否找到{if (*text2 == '\0')return ret; //找到了}ret++;}if (*ret == '\0') //找不到return NULL;
}
★strtok
①函数介绍
char * strtok(char * str, const char * sep);
●功能:利用分隔符,分隔字符串
●sep参数是个字符串,定义了用作分隔符的字符集合
●第一个参数指定一个字符串,它包含了0个或者多个由于sep字符串中一个或者多个分隔符分隔的标记
●strtok函数知道str中的下一个标记,并将其用’\0‘结尾,返回一个指向这个标记的指针。(注:strtok函数会修改被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
●strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
●strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
●如果字符串中不存在更多的标记,则返回NULL指针。
//strtok的使用演示1
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "welcome@to#my.blog";char* p = "@.#";char arr2[30] = "";strcpy(arr2, arr1); //将数据拷贝一份,处理arr2数组内的内容printf("%s\n", strtok(arr2, p));printf("%s\n", strtok(NULL, p));printf("%s\n", strtok(NULL, p));printf("%s\n", strtok(NULL, p));return 0;
}
想必有的小伙伴看完上面的函数介绍就写出了如上的strtok函数使用,但是这样写未免太接地气了,敲得手也很累,下面展示strtok实用的使用演示:
//strtok的模拟实现2
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "welcome@to#my.blog";char* p = "@.#";char arr2[30] = "";char* ret = NULL;strcpy(arr2, arr1); //拷贝字符串for (ret=strtok(arr2, p); ret != NULL; ret=strtok(NULL, p)){printf("%s\n", ret);}return 0;
}
关注我 _麦麦_分享更多干货:_麦麦_的博客_CSDN博客-领域博主
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下期见!