长度受限制的字符串函数
这篇文章将会向大家介绍几个长度受限制的字符串函数,分别是strncpy、strncat和strncmp。为什么这三个函数是长度受限制的字符串函数呢?因为在调用这些函数时,我们需要多传一个无符号整型数据。相较于长度不受限制的字符串函数,长度受限制的字符串函数也更加安全。首先我们先来学习strncpy。
1.strncpy
char * strncpy ( char * destination, const char * source, size_t num );
对于strncpy函数,我们需要注意一下几点:
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
- 目标空间必须可变。
- 模拟实现strncpy函数
代码示例:
字符串的长度小于 num 的情况
#include <stdio.h> #include <string.h> #include <assert.h> int main() { char arr1[10] = "hello####"; char arr2[] = "bite"; strncpy(arr1, arr2, 6); printf("%s\n", arr1); return 0; }
模拟实现strncpy函数 :
#include <stdio.h> #include <string.h> #include <assert.h> char* my_strncpy(char* dest, char* source, int n) { assert(dest && source); char* start = dest; while (n && ((*dest++ = *source++) != '\0')) { n--; } //注意source先给dest赋值,再判断dest是否为\0 //所以当source为\0时,也会给dest赋值,不满足条件推出循环 if (n) { while (--n) { *dest++ = '\0'; } } return start; } int main() { char arr1[30] = "remember who you are!"; char arr2[] = "believe yourself!"; my_strncpy(arr1, arr2, 30); printf("%s\n", arr1); return 0; }
2.strncat
char * strncat ( char * destination, const char * source, size_t num );
对于strncat函数,我们需要注意一下几点:
- 将源字符串的字符追加到目标空间,以及 '\0' 。
- 如果源字符串的长度小于num,则仅复制 '\0' 之前的内容以及 '\0'。
- 目标空间必须可变。
- 模拟实现strncat函数。
代码示例 :
模拟实现strncat函数
#include <stdio.h> #include <string.h> #include <assert.h> char* my_strncat(char* dest, char* source, int n) { assert(dest && source); char* start = dest; while (*dest != '\0') { dest++; } while (n--) { if ((*dest++ = *source++) == '\0') { return start; } } *dest = '\0'; return start; } int main() { char arr[20] = "hello \0#########"; char arr2[] = "ww"; my_strncat(arr, arr2, 4); printf("%s\n", arr); return 0; }
注意:strncat 函数和 my_strncat 函数只会给目标空间的末尾加一个 '\0'。
3.strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
对于strncmp函数,我们需要注意: 此函数开始比较每个字符串的第一个字符。如果它们相等,则继续向后比较,直到字符不同或直到'\0'亦或比较次数达到num。strncmp的返回值为大于0、等于0或小于0。
代码示例
模拟实现strncmp函数
#include <stdio.h> #include <string.h> #include <assert.h> int my_strncmp(const char* str1, const char* str2, int n) { assert(str1 && str2); int count = 0; while (*str1 == *str2) { count++; if (*str1 == '\0') return 0; if (count == n) return 0; str1++; str2++; } return *str1 - *str2; } int main() { char arr1[] = "hello "; char arr2[] = "hello sz"; int ret; ret = my_strncmp(arr1, arr2, 6); printf("ret = %d\n", ret); ret = my_strncmp(arr1, arr2, 7); printf("ret = %d\n", ret); return 0; }
以上就是本篇博客的内容,大家可以尝试去模拟实现这些函数,让自己理解得更加深刻。如果大家觉得有收获的话,可以点个赞支持一下哦!!