strncpy函数的使用和模拟实现
目录
1.头文件
2.strncpy函数功能
2.1情况二:
3.strncpy函数(模拟实现)
方源一把抓住VS2022,催动春秋产的气息,顷刻炼化!
1.头文件
strncpy函数的使用需要包括头文件<string.h>
#include<string.h>
2.strncpy函数功能
简述:strncpy函数是一种用于复制字符串内容的函数
strncpy函数接收两个地址参数,和一个size_t类型的参数(这里指的是多少个字节),这里以图片讲解,第一个地址名为destination,第二个地址名为source
我们知道,字符串只要给出其中一个字符的地址,那系统就会顺藤摸瓜出这个地址之后所有的字符
strncpy的作用就是从第二个地址所对应的字符开始,总共复制num个字节的内容,粘贴到第一个地址所对应的字符串里
示例如下:
需要注意的是,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个k char 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个k char arr2[] = { "ghj" }; int sz = strlen(arr1);//sz = 14; strncpy(arr1, arr2, 7); //arr2只有4个(arr2中的'\0'可以复制上去),距离7字节还差3个字节 //arr1 : ghj\0\0\0\0xxkkkkk for (int i = 0; i < sz; i++) { printf("%c ", arr1[i]); } //打印出 : ghj\0\0\0\0xxkkkkk }
截图示意:
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++;
}
}
//足够的情况
//不足够的情况下,一样复制,剩下的补0
else {
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会等于-1
while (num - kd > 0) {
//7-4 == 3,想执行三次,那每一次kd++
*arr1++ = '\0';
//ghj xxxx
//ghj xxx
//ghj xx
kd++;
}
}
}
}
int main()
{
char arr1[] = { "abcexxxxx" };//5个x
char 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\0xx
for (int i = 0; i < sz; i++) {
printf("%c ", arr1[i]);
}
}