Linux C strncpy 函数详解及代码实例

函数原型

char *strncpy(char *dest, const char *src, size_t n);

实现代码

char *  strncpy(char *dest, const char *src, size_t n)
{
    size_t i;

    for (i = 0; i < n && src[i] != '\0'; i++)
        dest[i] = src[i];
    for ( ; i < n; i++)
        dest[i] = '\0';

    return dest;
}

说明

  1. 函数功能,将字符数组src数据拷贝到dest字符数组中, n表示要拷贝的字节数。
  2. 从实现代码中看出,当遇到\0字符时,结束拷贝并将dest后续字符赋值为\0, 当dest剩余空间很大影响拷贝效率。
  3. 拷贝数据实际大小等于n时,strncpy不会在结束后添加\0字符。

实例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char  des_str[100] = {0};
	char  des_str2[5] = {0};
	char  src_str[100] = {0};
	strcpy(src_str, "123456");
	strcpy(src_str + 10, "123456");

	// 只会拷贝前6个字节,遇到‘\0’ 自动结束拷贝
	strncpy(des_str, src_str, 18);
	printf("des_str = [%s]\n", des_str);
	printf("des_str = [%s]\n", des_str + 10);
	
	printf("--------------------------------------\n");
	strncpy(des_str+10, src_str+10, 18);
	printf("des_str = [%s]\n", des_str);
	printf("des_str = [%s]\n", des_str + 10);
	
	printf("--------------------------------------\n");
	strncpy(des_str2, src_str, sizeof(des_str2));
	printf("des_str2 = [%s]\n", des_str2);
	printf("size = [%lu]\n", sizeof(des_str2));
	
	// 拷贝不会添加'\0', 拷贝长度 == sizeof(des_str2)
	printf("--------------------------------------\n");
	printf("don't add \'\\0\' character\n");
	strncpy(des_str2, "abcef", sizeof(des_str2));
	printf("des_str2 = [%s]\n", des_str2);
	printf("size = [%lu]\n", sizeof(des_str2));
	
	// 正确拷贝,如果des_str2空间很大会影响效率
	printf("--------------------------------------\n");
	memset(des_str2, 0, sizeof(des_str2));
	strncpy(des_str2, src_str, sizeof(des_str2)-1);
	printf("des_str2 = [%s]\n", des_str2);
	printf("size = [%lu]\n", sizeof(des_str2));
	return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相约天涯海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值