函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串

char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n)/*功能: * C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n ...
摘要由CSDN通过智能技术生成
char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n)

/*功能:
 * C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小>于 n 时,dest 的剩余部分将用空字节填充。*/
/*参数:
 * dest -- 指向用于存储复制内容的目标数组。
 * src -- 要复制的字符串。
 * n -- 要从源中复制的字符数。*/
/*返回值:

 * 该函数返回最终复制的字符串。*/

  
  说明:
        如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
        如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
        src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针。

不考虑内存重叠

int main(void)
{
        char src[40];
        char dst[12];
        char dst_less[25];

        strcpy(src,"This is runoob.com");

        printf("strlen(src) = %d\n",strlen(src)); //strlen(src) = 18

 

误解一:如果src 长度大于等于 n, 那么 strncpy 会拷贝 n – 1 各字符到 dest, 然后补 0?

错,大错特错,罚抄上面的 DESCRIPTION ,直到看到:

if there is no null byte among the first n bytes of src, the result will not be null-terminated.

这就可能导致了不安全的因素。

如果待拷贝字符串长度大于了 n, 那么 dest 是不会有结尾字符 0 的。假设这样一种情况:

1

2

3

char s[] = "hello world";

strncpy(s, "shit!", 5);

puts(s);

输出的结果是 “shit” 还是 “shit! world” ?

这种情况只是导致了输出结果错误,严重的,如果 dest n 字节后面一直没有 0,那么就会导致程序段错误。

strncpy 最开始引入标准库是用来处理结构体中固定长度的字符串,比如路径名,而这些字符串的用法不同于 C 中带结尾字 0 的字符串。所以 strncpy 的初衷并不是一个安全的 strcpy.

        //src 的长度     大于 或者 等于     len的长度(18>10)
        //把src所指向的字符串复制到dest,最多赋值10个,注意它的结果不会以NUL字节结尾(NUL即'\0')
        memset(dst,'\0',sizeof(dst));
        strncpy(dst,src,10);
        printf("最终的目标字符串是:%s\n",dst);//最终的目标字符串是:This is ru

误解二:如果 src 长度小于 n, 那么strncpy 和 strcpy 效果一样?

错,事实上,strncpy 还会把 dest 剩下的部分全部置为 0!

        //src的长度      小于      len的长度(18<20)
        //dest_less数组 的剩余部分将用空字节填充 到len的长度。
        printf("sizeof(dst_less)=%d\n",sizeof(dst_less)); //sizeof(dst_less)=25
        memset(dst_less,'\0',sizeof(dst_less));
        strncpy(dst_less,src,20);
        printf("最终的目标字符串是: %s\n",dst_less);//最终的目标字符串是: This is runoob.com

一直认为 strncpy 只是比 strcpy 多了长度校验,确不知道 strncpy 会把剩下的部分全置为 0(粗体部分)。

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

DESCRIPTION
The strcpy() function copies the string pointed to by src (including the terminating `\0′ character) to the array pointed to by dest. The strings may
not overlap, and the destination string dest must be large enough to receive the copy.
The strncpy() function is similar, except that not more than n bytes of src are copied. Thus, if there is no null byte among the first n bytes of src,
the re

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值