`

strncpy & memcpy

 
阅读更多

strncpy和memcpy的用途:从一块内存复制一段连续的数据到另一块内

区别:终结标识不同。

strncpy会比较每个字符是否为'\0'以判定是否继续复制;

memcpy不管内存数据内容,复制指定的长度(不讨论源串有错误或者目的空间不够等出错的情况)。

 

对于字符串类型,二者效果一直,但是对于二进制格式或者exe之类的序列化文件,复制最好采用memcpy。今天拷贝一个mcpack的结构体,开始使用strncpy,觉着代码写的没问题,但是解析完的字符串一直有问题,后来尝试memcpy,竟然成功了。

所以,在选用使用哪种接口时,最好先看一下自己要处理的数据类型。

 

下面贴出两个接口的定义及实验原理:

 

    1、memcpy

函数原型:extern void *memcpy(void *dest, const void *src, size_t count);
用法:#include<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
注意:和strcpy相比,memcpy不是遇到’/0’就结束,而是一定会拷贝完n个字节。

函数实现代码:

void *memcpy(void *dest, const void *src, size_t count)
{

     assert(dest!=NULL&&src!=NULL);
     char *tmp = dest;
     const char *s = src;

     while (count--)
     *tmp++ = *s++;
     return dest;
}

 

2.strncpy
函数原型:extern char *strncpy(char *dest, char *src, int n); 
用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
        如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
        如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
        src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针(该指向dest的最后一个元素)
实现代码:

char * strncpy(char * dest,const char *src,size_t count)
{    
    char *tmp = dest;
    while (count-- && (*dest++ = *src++) != '/0')
    /* nothing */;
    return tmp;
}

分享到:
评论

相关推荐

    strncat strncpy strncmp memcpy memcmp 比较及其原型

    strcmp strcpy strcat strlen 的实现 以及与strncat strncpy strncmp memcpy memcmp 原型分析

    25_strcpy_strncpy_memcpy的区别1

    1. 复制的内容不同 2. 复制的法不同 3. 途不同 1. dest指向的空间要够拷 3. 使strncpy时,确保dest的最后个字符是“\0”

    字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    以下是对字符串拷贝函数memcpy和strncpy以及snprintf它们之间的性能进行了比较,需要的朋友可以过来参考下

    安全函数strcpy_s、strncpy_s、snprintf_s、memcpy_s

    用于了解安全函数strcpy_s、strncpy_s、snprintf_s、memcpy_s

    自己总结的c基础知识

    我自己总结的一点东西,和大家分享。主要是关于fopen函数,strncpy和memcpy函数

    C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识。 1、strcpy和strncpy函数 这个不陌生,大一学...

    C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现

    void* memcpy( void *dest, const void *src, size_t count ) { char* pdest = static_cast*&gt;( dest ); const char* psrc = static_cast*&gt;( src ); // 依次从前拷贝,目的地址覆盖了源地址的数,此时从后往前...

    C语言函数库函数详细介绍手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C 语言库函数使用手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言库函数速查 CHM

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查手册

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    C语言函数速查

    memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strpbrk ...

    常见面试需要实现的函数std_func.c

    * 常见的字符串函数实现: * strlen * strcpy strncpy * strcmp strncmp * strcat strncat * strstr * * 内存操作: * memset、memcmp、memcpy、memmove * * 字符串和数组转换: * atoi itoa *

    四个拷贝函数的分析与实现

     1:strncpy和strncpy主要是用于字符串的拷贝。  2:而memcpy()和memmove()则适用于所有的数据类型。  3: memcpy()和memmove()这两者的区别在于内存重叠的处理。  4:本文给出的代码都是基于函数的功能所写的...

    C语言字符串各函数-具体实现

    strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchr,strnchr,strlen,strnlen,strspn,strpbrk,strtok,strsep,memset,bcopy,memcpy,memmove,memcmp,memscan,strstr,memchr.函数具体实现内容。对理解C语言和C编程有...

    C/C++字符串函数之复制函数详解

    突然发现对字符串函数缺乏系统的了解,所以花了...2、char* strncpy(char* destination,const char* source,size_t num); 3、void * memcpy(void* destination,const void* source,size_t num); 4、void * memmove(voi

    嗅探器源代码

    memcpy(&sa.sin_addr.S_un.S_addr, pHostent-&gt;h_addr_list[0], pHostent-&gt;h_length); bind(sock, (SOCKADDR *)&sa, sizeof(sa)); if ((WSAGetLastError())==10013) exit(1); WSAIoctl(sock, SIO_RCVALL, ...

    libft:ft_library

    ft_strncpy 21. ft_atoi 2. ft_bzero 12. ft_strcat 22. ft_isalpha 3. ft_memcpy 13. ft_strncat 23. ft_isdigit 4. ft_memccpy 14. ft_strlcat 24. ft_isalnum 5. ft_memmove 15. ft_strchr 25. ft_...

    C标准库函数.CHM

    The C Library Reference Guide by Eric Huss ...Introduction 1. Language 1.1 Characters 1.1.1 Trigraph Characters ... 2.14.14 strncpy 2.14.15 strcspn 2.14.16 strerror 2.14.17 strlen 2.14.18 strpbrk ...

Global site tag (gtag.js) - Google Analytics