前言:
之前我介绍了四个常用字符串函数的使用方法和自定义模拟实现,大家感兴趣的话去看一看作者的上一篇文章:
字符串函数(1)strlen,strcpy,strcat,strcmp等函数的使用_
接下来我会讲一讲strncpy、strncat、strncmp三个函数的使用方法! 这三个函数与我上一篇文章中介绍到的三个strcpy、strcat、strcmp函数同根同源,实属一家。唯一不同的是,接下来讲的这三个函数都多添加了一个参数:size_t num ,这使得我们可以控制函数执行过程中的一些内容,限制了程序的执行条件,可以给程序猿带来了很大的方便!
目录
一.受限制的字符串函数
以下字符串均是<string.h>库中的函数,使用时要引头文件!!!
1.strncpy——字符串拷贝函数
Copy characters of one string to another.意为:将一个字符串的字符复制到另一个字符串。
char* strDestination:目的地指针,被拷贝的字符串
const char* strSource:源头指针,拷贝的字符串(不可修改)
size_t count 表明我们可以控制源头字符串拷贝多少个字节数过去,count的单位是字节数,而char型字符所占空间为一个字节,那么我们也可以理解为count可以控制源头字符串拷贝多少字符到目的地字符串。
使用strncpy的注意事项:
注:strncpy可以设置拷贝字符的大小。(在不越界数组长度的前提下,arr1想拷贝几个字符过去就拷贝几个字符过去)
目的地的空间必须足够大,否则会出错。
举个例子代码:
int main() {
char arr1[7] = "hello.";
strncpy(arr1, "world!", 6);
printf("%s\n", arr1);
return 0;
}
代码讲解:strncpy中的参数表明字符串"world!"要拷贝到arr1中,且设置了拷贝字符的个数为前6个,那么拷贝过去的字符为:‘w','o','r','l','d','!' 。覆盖掉目的地字符串原本的 'h', 'e', 'l', 'l', 'o', '.' 六个字符,但arr1中的 '\0'字符还在,没有被覆盖掉。
这就是strcpy与strncpy的区别:strcpy会一股脑把源头字符串所有字符(包括'\0')全都拷贝到目的地字符串;而strncpy会控制拷贝字符的个数,让我们想拷贝几个字符就拷贝几个字符。
练习1.
char arr2[] = "hello.";
strncpy(arr2, "world!", 4);
printf("%s\n", arr2);
代码讲解:
程序将字符串"world!"拷贝到arr2中,控制了源头字符串传输的个数为4,那么传输过去的只有:'w','o','r','l' 四个字符,从而覆盖掉hell。最终令arr2变成"worlo."
练习2.
char arr3[5] = "bit";
strncpy(arr3, "hahaha!", 7);
printf("%s\n", arr3);
代码讲解:
arr3的大小为5,而字符串"hahaha!"共有8个字符(外加'\0'),越界拷贝,发生冲突。
所以要注意,目的地的空间必须足够大
2.strncat追加字符串函数
size_t count 可自主追加字符的个数
char* strDestination:目的地指针,被拷贝的字符串
const char* strSource:源头指针,拷贝的字符串(不可修改)
函数实现原理:源头的字符串,会先找到目的地字符串的末尾结束标志'\0'字符,然后源头会将其'\0'字符覆盖掉,根据给出的追加的前count个字节数向目的地字符串中追加源头的字符 。
如果count大于字符串src的长度,那么函数仅将src全部追加到dest的尾部;
如果count小于src的字符数,函数只会将src的前count个字符附加在dest末尾。
无论哪种情况,都会在新字符串的末尾自动添加'\0'字符。
1.使用代码
int main() {
char arr1[20] = "sky is";
strncat(arr1, "blue",4);
printf("%s\n", arr1);
追加的内容会找到arr1字符串中末尾的'\0'字符,将b字符替换掉'\0'开始向后追加,追加四个字符个数,那么是把 b l u e四个字符追加过去,且在末尾顺带一个'\0'字符,结束追加。
练习2.
char arr2[20] = "hello ";
char arr3[] = "bit!";
strncat(arr2, arr3, 5);
printf("arr2:%s\n", arr2);//"hello bit!"
printf("----------------------------------------\n");
练习3.
char arr4[20] = "abcdef";
strncat(arr4, arr4, 6);
printf("arr4:%s\n", arr4);
printf("----------------------------------------\n");
代码讲解:这是一段arr4数组自己追加自己的代码 ,结果为:arr4:abcdefabcdef,在上一篇中并没有对strcat函数采用这段代码,是因为strcat不可实现自追加功能,会造成死循环,使系统崩溃掉,而strncat可以采用。
注:strncat也要保证目的地的数组空间要足够大
3.strncmp函数
strncmp函数是用来比较两字符串相应位置上ASCII码值大小的函数。
判断标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
size_t count可以控制函数比较的此数,我会通过代码来讲解count的作用。
int main() {
char a1[] = "abcdef";
char a2[] = "abcdo";
int ret=strncmp(a1, a2,4);
if (ret > 0)
printf(">\n");
else if (ret == 0)
printf("==\n");
else
printf("<\n");
解析:我创建了两个字符串数组a1,a2,采用了strncmp函数进行两数组的比较,而且设置了比较的次数为4。a1的a与a2的a比较,结果相同,进行下一对的比较。比较了4次后达到了strncmp函数的要求,不再进行比较,基于对前面的比较结果最终判定a1与a2两个字符串相等,返回0。
这就是strncmp函数的优点,虽然两字符串本质上并不相等,但设置了次数,就可以打破本质,改变规矩,达到我们想要的结果!!!
以上就是我对受限制字符串函数strncpy,strncat,strncmp函数的介绍,觉得有用的话点个一键三连吧!下期见!