【strncpy函数拷贝数组问题分析】

本文分析了使用strncpy函数拷贝数组时出现的问题,并提供两种替代方案。错误在于原数组缺少终止符'',导致拷贝不完整。通过直接for循环拷贝或使用memcpy函数可以有效解决这一问题。

strncpy函数拷贝数组问题分析

问题

最近在使用strncpy拷贝数组元素值的时候,出了问题,查了网上的函数用法并看了函数原型,才发现问题。先上问题,后面再提解决方法。

错误代码

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

#define BUF_MAX 10
int main()
{
    int i;
    char src_buf[BUF_MAX ]={1,2,3,4,5,0,7,8,9,10};
    char dest_buf[BUF_MAX ]={0};

    strncpy(dest_buf,src_buf,10);
    printf("src_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",src_buf[i]);

    printf("\ndest_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",dest_buf[i]);
    printf("\n");
    return 0;        
}

输出结果
src_buf:
1 2 3 4 5 0 7 8 9 10
dest_buf:
1 2 3 4 5 0 0 0 0 0

分析

strncpy函数原型:

     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;
      }

从函数原型中,可以看到,该函数的for循环结束条件:i < n && src[i] != ‘\0’,原字符串必须要有结束字符’\0’而我们在错误代码中,src_buf[5] = 0,src_buf[9] = 10,没有结束字符’\0’,而导致问题产生。

解决方法

使用最原始的for循环,将原数组src的元素依次赋值给数组dst中
方法1

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

#define BUF_MAX 10

int main()
{
    int i;
    char src_buf[BUF_MAX]={1,2,3,4,5,0,7,8,9,10};
    char dest_buf[BUF_MAX]={0};
    
    //strncpy(dest_buf,src_buf,10);
    for(i=0;i<10;i++)
        dest_buf[i] = src_buf[i];
    printf("src_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",src_buf[i]);

    printf("\ndest_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",dest_buf[i]);
    printf("\n");
    return 0;        
}

方法2

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

#define BUF_MAX 10

int main()
{
    int i;
    char src_buf[BUF_MAX]={1,2,3,4,5,0,7,8,9,10};
    char dest_buf[BUF_MAX]={0};
    
    memcpy(dest_buf,src_buf,10);
    printf("src_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",src_buf[i]);

    printf("\ndest_buf:\n");
    for(i=0;i<10;i++)
        printf("%d ",dest_buf[i]);
    printf("\n");
    return 0;        
}

输出结果:
src_buf:
1 2 3 4 5 0 7 8 9 10
dest_buf:
1 2 3 4 5 0 7 8 9 10

总结

在拷贝数组的时候,如果原数组有0也就是结束字符’\0’,千万不要为了省事,来使用strncpy函数来拷贝数组。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值