您的位置:首页 > 游戏 > 游戏 > strncpy函数的使用和模拟实现

strncpy函数的使用和模拟实现

2024/12/23 16:38:04 来源:https://blog.csdn.net/2301_80349538/article/details/141996958  浏览:    关键词:strncpy函数的使用和模拟实现

e8539b3addfd4272b580ea6bc7050702.png

目录

 1.头文件

 2.strncpy函数功能

2.1情况二:

3.strncpy函数(模拟实现)


方源一把抓住VS2022,催动春秋产的气息,顷刻炼化!


 1.头文件

strncpy函数的使用需要包括头文件<string.h>

#include<string.h>

 2.strncpy函数功能

cf35f6fa0bee4026b225f5bc863a14e0.png

简述:strncpy函数是一种用于复制字符串内容的函数

strncpy函数接收两个地址参数,和一个size_t类型的参数(这里指的是多少个字节),这里以图片讲解,第一个地址名为destination,第二个地址名为source

我们知道,字符串只要给出其中一个字符的地址,那系统就会顺藤摸瓜出这个地址之后所有的字符

strncpy的作用就是从第二个地址所对应的字符开始,总共复制num个字节的内容,粘贴到第一个地址所对应的字符串里

示例如下:

0d103f18deab452dadad36a05ac6296c.png

需要注意的是,strncpy函数在复制时不会自动补上'\0',我们可以看到,我们只复制了两个字节的内容,如果补上了'\0',那么字符'c'就会被替换成'\0'

strncpy函数让复制几个字节就复制几个字节,不会多给你添任何东西


2.1情况二:

如果想要复制的字节个数,arr2中不够呢?

比如:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>int main()
{char arr1[] = { "abcexxxxxkkkkk" };//5个x 5个kchar arr2[] = { "ghj" };int sz = strlen(arr1);//sz = 14;strncpy(arr1, arr2, 7);for (int i = 0; i < sz; i++) {printf("%c ", arr1[i]);}
}

这样会打印什么?

当使用strncpy函数时,如果源字符串(arr2)的大小不够 num,那就会在复制完arr2后,一直补充0,直到凑够num个,示例如下:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>int main()
{char arr1[] = { "abcexxxxxkkkkk" };//5个x 5个kchar arr2[] = { "ghj" };int sz = strlen(arr1);//sz = 14;strncpy(arr1, arr2, 7);//arr2只有4个(arr2中的'\0'可以复制上去),距离7字节还差3个字节//arr1 : ghj\0\0\0\0xxkkkkkfor (int i = 0; i < sz; i++) {printf("%c ", arr1[i]);}//打印出 : ghj\0\0\0\0xxkkkkk
}

 截图示意:

a3bd238282bc43cc8f060a3e7f8f0c42.png


3.strncpy函数(模拟实现)

代码如下:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<string.h>
void my_strncpy(char* arr1, char* arr2, size_t num, size_t sz2) {int kd = sz2;if (num <= sz2) {while (num--) {*arr1++ = *arr2++;}}//足够的情况//不足够的情况下,一样复制,剩下的补0else {while (sz2--) {*arr1++ = *arr2++;//sz2 = 4, gbcexxxxx//sz2 = 3,ghcexxxxx//sz2 = 2,ghjexxxxx//sz2 = 1,ghj xxxxx//sz2 = 0,ghj ?xxxx//sz2 = -1//while (sz2--) 在最后一次迭代时,sz2 的值为 0,依然会使循环体执行一次,但之后将 sz2 递减到 -1,从而退出循环。           }if (sz2 == -1) {//sz2会等于-1while (num - kd > 0) {//7-4 == 3,想执行三次,那每一次kd++*arr1++ = '\0';//ghj  xxxx//ghj   xxx//ghj    xxkd++;}}}}int main()
{char arr1[] = { "abcexxxxx" };//5个xchar arr2[] = { "ghj" };int sz2 = strlen(arr2);//arr2的个数int sz = strlen(arr1);my_strncpy(arr1, arr2,7,sz2+1);//想复制7个,那就多出3个0,应该打印ghj\0\0\0\0xxfor (int i = 0; i < sz; i++) {printf("%c ", arr1[i]);}
}

8fdd48caf53e46a897fd8a5554dbb454.png

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com