strncpy_s复制字符串到数组中

问题描述:

const char* str = "helloworld";
strncpy_s(pd.arr, str, sizeof(str));

我试图将字符串"helloworld"复制到结构体pd的arr中, arr是一个64大小的字符数组,然而测试时发现只复制了hell。 

解决思路:

1. 首先我想到的是有没有特殊字符,很显然没有;

2. 在没有想到其他原因下,我打算试一下别的数据能不能复制成功,经过大量的测试发现,如果str的字符数量小于等于4字符,则可以全部复制到结构体的arr中,如果大于4字符则会被阶段,然后打印了下sizeof(str)发现其值是4.

原因:

str是一个字符指针,而sizeof是取静态的长度,也就是一个指针的长度,在32位机器下一个指针是4字节,而64位机器下一个指针是8字节,本机虽然是64位,由于我选择的系统是32位,因此指针的大小是4字节,这也就解释了为什么只能复制4个字符。

解决办法

用strlen来返回字符串的长度,如下面的测试代码:

int main() {
    const char* str = "Hello World!";
    int size_sizeof = sizeof(str);
    int size_strlen = strlen(str);
    std::cout << "size_sizeof = " << size_sizeof << "---" << "size_strlen = " << size_strlen << std::endl;
    return 0;
}

输出结果如下:size_sizeof = 8---size_strlen = 12,可以看到64位机器下指针占8字节,字符串包含12字符,并没有包含结束符,如果要保存到数组中小心空间要多开辟一个字符的空间。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值