strncpy函数的使用和模拟实现

目录

1.头文件

2.strncpy函数功能

2.1情况二:

3.strncpy函数(模拟实现)


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


1.头文件

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

cpp 复制代码
#include<string.h>

2.strncpy函数功能

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

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

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

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

示例如下:

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

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


2.1情况二:

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

比如:

cpp 复制代码
#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个,示例如下:

cpp 复制代码
#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函数(模拟实现)

代码如下:

cpp 复制代码
#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]);
	
	}
}
相关推荐
qq_4480111612 分钟前
C语言中的动态内存分配
c语言·开发语言·php
FakeOccupational38 分钟前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
动词ing1 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光1 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒1 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter1 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
hy.z_7772 小时前
【C++】13. 继承
c++
汉字萌萌哒2 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院2 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
小雨笙笙2 小时前
C语言:变量三属性——存储类型
c语言·开发语言