目录
关于字符串函数,已介绍过strlen、strcpy、strcat、strcmp等函数。
其中,strcpy、strcat、strcmp称为长度不受限制的字符串函数;
求字符串长度函数strlen相关文章如下:
【C语言】_字符串函数strlen-优快云博客https://blog.youkuaiyun.com/m0_63299495/article/details/145134049长度不受限制的字符串函数文章链接分别如下:
字符串拷贝函数strcpy:
【C语言】_字符串函数strcpy-优快云博客https://blog.youkuaiyun.com/m0_63299495/article/details/145136375 字符串追加函数strcat:
【C语言】_字符串函数strcat-优快云博客https://blog.youkuaiyun.com/m0_63299495/article/details/145138951字符串比较函数strcmp:
本文介绍对应的另外一组函数:strncpy、strncat、strncmp,称为长度受限的字符串函数;
1. 长度受限的字符串拷贝函数strncpy
1.1 strcpy与strncpy
相较于strcpy,strncpy增加了一个了一个类型为 size_t的参数num,
表示从源字符串进行拷贝的字符的最大个数;
1.2 strncpy函数的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "hello world";
char arr2[20] = { 0 };
strncpy(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
运行结果如下:
1.2.1 关于\0的拷贝
对于待拷贝字符串src,是否会在要求的num个字符后再向dest中拷贝一个\0?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "hello world";
char arr2[20] = "xxxxxxxxxxxxxxxxxx";
strncpy(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
调试监视arr2各元素值如下:
可见:
对于strncpy,只拷贝src中要求的num个字母,并不会给拷贝后的num个字母后默认增加1个'\0';
1.2.2 关于\0的补位填充
若传递给strncpy的参数num大于待拷贝字符串src的有效长度,是否会在src后补位\0以满足要求的num?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "hello world";
char arr2[20] = "xxxxxxxxxxxxxxxxxx";
strncpy(arr2, arr1, 15);
printf("%s\n", arr2);
return 0;
}
调试监视arr2数组的各元素:
可见:
对于strncpy,若传递给strncpy的参数num大于待拷贝字符串src的有效长度,则会在src后补位\0以满足要求的num个字符的拷贝;
2. 长度受限的字符串追加函数strncat
2.1 strcat与strncat
相较于strcat,strncat增加了一个了一个类型为 size_t的参数num,表示追加的字符的最大个数;
2.2 strncat的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "worldHELLOWORLD";
char arr2[20] = "hello ";
strncat(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
运行结果如下:
2.2.1 关于\0的追加
对于src字符串,在将其追加到dest字符串'\0'的位置之后,是否会在src字符串后默认追加一个\0?
测试思路为:初始化dest为不同于'\0'字符的其他字符串,本例采用x,为令src不从dest默认结尾处的\0处开始追加,在字符串中手动设置一个\0:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "worldHELLOWORLD";
char arr2[20] = "hello\0xxxxxxxxxx";
strncat(arr2, arr1, 5);
printf("%s\n", arr2);
return 0;
}
调试监视arr2数组各元素:
可见:
对于strncat,在将要求的来自src字符串的n个字符追加到dest字符串'\0'的位置之后,在src字符串后会默认追加一个\0;
2.2.2 关于\0的补位填充
若追加完src中的有效字符且补充一个\0后,仍有待追加的位置,
即给定的字符追加参数num>(src有效字符数+额外填充的1个'\0'位),
那么余下的位置是否会继续填充'\0'?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "worldHELLO";
char arr2[20] = "hello\0xxxxxxxxxxxx";
strncat(arr2, arr1, 14);
printf("%s\n", arr2);
return 0;
}
调试监视arr2数组各元素如下:
可见:
对于strncat,当给定的字符追加参数num>(src有效字符数+额外填充的1个'\0'位),
dest余下的位置不会填充'\0'或其他字符,保持默认字符不变;
3. 长度受限的字符串比较函数strcmp
3.1 strcmp与strncmp
相较于strcmp,strncmp增加了一个了一个类型为 size_t的参数num,
表示两个字符串进行比较的的字符的最大个数;
3.2 strncmp的使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "abcdef";
char arr2[] = "abcddf";
int ret1= strncmp(arr1, arr2, 4);
int ret2 = strcmp(arr1, arr2, 6);
printf("ret1=%d\n", ret1);
printf("ret2=%d\n", ret2);
return 0;
}
运行结果如下:
4. 关于长度受限与长度不受限
本文开篇已说明:
strcpy、strcat、strcmp称为长度不受限制的字符串函数;
strncpy、strncat、strncmp称为长度受限的字符串函数;
相比较而言,长度不受限制的字符串函数是不安全的,长度受限的字符串函数是相对安全的;