一、前言
前面我们介绍过了strcpy、strcat、strcmp但是这些函数遇到'\0'才会停止,这些函数不会顾及
目的地内存空间的大小,只会一直使用直到遇到\0,所以这些函数是不安全的(常会发生越界访
问,和非法访问)。
二、strncpy strncat strncmp函数介绍
1.strncpy函数
函数的参数形式char *strncpy(char*destination,const char *source,size_t num)
其中size_t表示的是无符号整数,单位是字节。
num是选择拷贝多少个,注意:如果拷贝的个数大于源头的个数则多余的个数
全拷贝'\0'。该函数也是只能拷贝字符滴,且目的地的空间要足够大。
函数的使用:
#include<stdio.h> #include<string.h> int main() { char arr1[30]={"kongchao"}; char arr2[30]={"hello world"}; strncpy(arr2,arr1,9);//拷贝九个是因为第九个字节是'\0' printf("%s",arr2); return 0; }
strncpy函数模拟实现
#include<stdio.h> #include<assert.h> char*strncpy(char*dest,char*src,int k) { assert(dest&&src);//判断非空 char*nb=dest; while((*dest++ = *src++)&&(k--)) { ; } return nb; } int main() { char arr1[30]={"ni shi hei ma"}; char arr2[30]={"ni na nie"}; int k=0; printf("请输入你要拷贝的字节数");//空格不算个数里面 scanf("%d",&k); char*ret=my_strncpy(arr1,arr2,k); printf("%s",arr1);//写ret也是一样的(都是arr1的首元素地址) return 0; }
2.strncat函数
函数的参数形式char*strncat(char*dest,const char*src,size_t num)
这个函数的形式简直和上面那个strncpy一模一样(他们的模拟实现也是基本一样的,
可以说strncpy是strncat的子集)注如果连接的个数大于源头个数,则还是连接源头个数。
函数使用:
#include<stdio.h> #include<string.h> int main() { char arr2[30]={"zhangdahou"}; char arr1[30]={"xiaoshihou"}; strncat(arr1,arr2,6);//连接6个 printf("%s",arr1); return 0; }
注意如果是这种strncat(arr1+n,arr2,8);其中n小于等于arr1的长度,则arr2还是连接到arr1后面,若大于则报错。
strncat函数模拟实现
#include<stdio.h> #include<assert.h> char*my_strncat(char*dest,char*src) { assert(dest&&src); char*ret=dest;//记下开始的位置 while(*++dest) { ; } while(*dest++=*src++) { ; } return ret; } int main() { char arr1[50]={"kong chao yao "}; char arr2[30]={"cheng wei da niu"}; char*kc= my_strncat(arr1,arr2); printf("%s",kc); return 0; }
3.strncmp函数
函数的参数形式int strncmp ( const char * str1, const char * str2 ,size_t num);
size_t表示无符号整形,num表示字符比较的个数,返回类型str1>str2返回大于0的数
str1=str2返回0,str1<str2,返回小于0的数。(vs默认返回1 0 -1)。
函数的使用
#include<stdio.h> #include<string.h> int main() { char arr1[4] = { "asdf" }; char arr2[4] = { "ase" }; int dd=strncmp(arr1, arr2, 3);//arr1和arr2比较 printf("%d\n", dd);//结果是小于0的随机数 return 0; }
strncmp函数模拟实现
#include<stdio.h> #include<assert.h> int my_strncmp(char*str1, char*str2,int k) { assert(str1&&str2); while ((*str1== *str2) && (k--)) { str1++; str2++; if ((*str1 == '\0') || (k == 0)) { return 0; } } return *str1 - *str2; } int main() { char arr1[10] = { "abcdega" }; char arr2[10] = { "abcdeg" }; int kc = my_strncmp(arr1, arr2, 7); printf("%d\n", kc); return 0;