1.前言
在上一篇文章中我们讲过了长度不受限制的字符串函数,包括strlen函数,strcmp函数,strcpy函数,strcat函数,学过和没学过的老铁们可以点击长度不受限制的字符串函数
今天我们我们就讲讲长度受限制的字符串函数,包括strncpy函数,strncat函数,strncmp函数,在这些函数中长度受限制是需要我们加上要修改的字节数。还有一些特殊的函数包括strstr函数,strtok函数。今天就来看看我们的内容吧。
2.长度受限制的字符串函数
2.1strncpy函数
我们进入cplusplus函数可以看到strnpcy函数的参数。
strncpy函数的返回类型是char*,他的参数是 char * destination, const char * source, size_t num,在这里对于source由于不需要进行修改,只是需要进行拷贝,所以加上const,对于size_num是需要将source字符串的num个字节进行拷贝到destination,在第一个字节处进行修改,详细的代码如下:
#include <stdio.h> #include <string.h> int main() { char arr[] = "abcdefghigh"; char brr[] = "zzzzz"; strncpy(arr, brr, 4); printf("%s", arr); return 0; }
我们运行查看
我们发现字符串arr的前4个字节修改为字符串的前4个字节。
2.2strncat函数
同样我们进入cplusplus函数查看它的参数。
strncat函数的返回值是char*,它的参数是 char * destination, const char * source, size_t num
和函数strncpy函数,由于source函数不需要进行修改,所以用const函数进行修改,在size_t num是需要连接的字符的个数,详细的代码如下:
#include <stdio.h> #include <string.h> int main() { char arr[100] = "abcdefghigh"; char brr[] = "xzzzzz"; strncat(arr, brr, 4); printf("%s", arr); return 0; }
我们运行代码可以看到:
在这里我么的字符串brr是source,把他的前4个字符连接到字符串arr后面,同时拷贝一下‘\0’;
2.3strncmp函数
我们进入cplusplus网站
我们可以看到strncmp的参数是const char * str1, const char * str2, size_t num,由于str1和str2不需要进行修改,只需要进行比较,所以用const进行修饰,size_t是需要比较的字符串的个数。对于strncmp函数的返回值是int类型,
如果第一个大于第二个返回大于0的数据,如果第一个小于第二个返回小于0的数据,如果第一个等于第二个则返回0,注意这里的比较是对于前num个字符进行比较,比较的形式和前面的额strcmp一样,具体的代码演示如下:
#include <stdio.h> #include <string.h> int main() { char arr[] = "abcdefghigh"; char brr[] = "abce"; int ret=strncmp(arr, brr, 4); printf("%d", ret); return 0; }
我们运行可以看到:
函数的返回值是-1。
2.4小结
对于这三个函数,他们和长度不受限制的类似,只是多了一个限制条件,这个限制条件是限制的source.也就是说num是几个就拷贝几个,里面的循环由遇到‘\0’的while循环,改为了for循环,判定是i<num。
3.特殊的字符串函数
3.1strstr函数
strstr函数是一个查找子串的函数,它返回最早出现字串的位置,我们进入cplusplus网站进行查看,
我们看第一条,它参数和返回值都用const进行修饰,事实上他们两条都一样,只是第一条用const进行修饰,让它的值不能改变,更加的安全,防止非法的修改。我们举个例子来感受一直strstr函数的应用,代码如下:
#include <stdio.h> #include <string.h> int main() { char arr[] = "abcabcdefghigh"; char brr[] = "abcd"; char *crr=strstr(arr, brr); printf("%s", crr); return 0; }
我们运行可以看到:
我们想要模拟实现,首先画一下它的思路:
就是由str2和str1进行记录位置,s1和s2进行比较,不相等str1和s1进行移动,相等str1和str2不动,s1和s2进行移动,相等移动,不相同重新指向str1和str2 ,依次循环,直到str1遇到‘\0’,模拟实现如下:
#include <stdio.h> char* my_strstr(char* arr, char* brr) { char* str1 = arr, * s1 = arr, * str2 = brr, * s2 = brr; while (*str1) { if (*s2 == '\0') { return str1; } if (*s1 == *s2) { s1++; s2++; } else { str1++; s1 = str1; s2 = str2; } } } int main() { char arr[] = "abcabcdef"; char brr[] = "abcd"; char* p = my_strstr(arr, brr); printf("%s", p); return 0; }
3.2strtok函数
我们可以看到,strtok函数返回类型是char*,它的参数是 、char * str, const char * delimiters,这个函数是字符串切割,需要两个字符串,第一个字符串中出现第二个字符串就会进行切割然后指向此段的首字符,具体的代码如下:
#include <string.h> #include <stdio.h> int main() { char arr[] = "abc,abcd@efacd*add"; char brr[] = ",@*"; char* str = arr; for (str = strtok(arr, brr); str != NULL; str = strtok(NULL, brr)) { printf("%s\n", str); } return 0; }
今天的内容就结束了,希望大家可以一键三连。