`

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 比较及其原型

    strncat、strncpy、strncmp、memcpy、memcmp 等字符串操作函数是 C 语言中常用的函数,它们分别用于字符串的连接、复制、比较和内存复制等操作。下面将对这些函数的原型和实现进行详细的分析。 首先,strncat 函数...

    25_strcpy_strncpy_memcpy的区别1

    在C/C++编程中,字符串处理是至关重要的,其中`strcpy`、`strncpy`和`memcpy`都是用于复制内存区域的函数,但它们在使用和功能上有所不同,特别是涉及到安全性和内存管理方面。 首先,`strcpy`函数是用于复制字符串...

    安全函数strcpy_s、strncpy_s、snprintf_s、memcpy_s

    传统的C语言函数如`strcpy`, `strncpy`, `sprintf`, 和 `memcpy`虽然功能强大,但它们缺乏对缓冲区溢出的安全检查,这可能导致严重的安全漏洞。为了解决这个问题,C标准库引入了安全版本的这些函数,例如`strcpy_s`,...

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

    问题:函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), “%s”, src)都可以将src字符串中的内容拷贝到dest字符串中。哪一种方式效率最高呢?就是说,哪种...

    strcpy与memcpy的区别-.docx

    在C语言和C++中,`strcpy`和`memcpy`都是用于复制内存...为了提高安全性,推荐使用`strncpy`或`strcpy_s`(在Windows平台上)这样的安全版本函数,或者使用C++的`std::string`类,它们通常能更好地防止缓冲区溢出问题。

    strcpy与memcpy的区别-.pdf

    同时,为了防止缓冲区溢出,使用strcpy时需要确保目标字符串有足够的空间容纳源字符串,或者可以使用更安全的strncpy函数,它允许指定目标字符串的最大长度。 总结起来,strcpy和memcpy都是C语言中重要的内存复制...

    深入理解strcpy与memcpy的区别

    在实际编程中,为了防止溢出,可以考虑使用`strncpy`作为`strcpy`的替代,因为它允许指定最大复制的字符数。同样,如果要复制包含嵌入零字节的数据,`memcpy`是更好的选择,因为它不关心数据内容,仅按字节复制。 ...

    strncpy与snprintf 的用法比较

    在C语言中,`strncpy` 和 `snprintf` 都是用来进行字符串处理的函数,但它们有着不同的特性和用途。下面将详细分析这两个函数的用法和它们之间的区别。 `strncpy` 函数用于安全地复制字符串,其原型定义为: ```c ...

    浅谈linux c编程中的拷贝函数.docx

    本文将重点探讨三个常见的拷贝函数:strcpy、strncpy以及memcpy,并分析它们的使用细节和潜在的风险。 首先,`strcpy`函数是最基础的字符串拷贝函数,它将源字符串的内容复制到目标字符串中。然而,`strcpy`并不...

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

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

    综合企业笔试题_嵌入式-常用知识&面试题库_大厂面试真题.docx

    字符串拷贝函数是将一个字符串拷贝到另一个字符串中,常用的函数有 strcpy、strncpy、memcpy 等。strcpy 函数将源字符串拷贝到目标字符串中,直到遇到nul 字符为止。strncpy 函数将源字符串的前 n 个字符拷贝到目标...

    自己总结的c基础知识

    本文将重点讨论字符串、`getchar()`函数以及`strcpy`、`strncpy`和`memcpy`这三个常用的内存拷贝函数。 首先,让我们来理解一下C语言中的字符串。在C语言中,字符串是由一系列字符组成的,以空字符`\0`作为结束标记...

    c语言与指针 个人觉得最好用的书

    * 字符串拷贝和内存拷贝函数:strcpy、strncpy、memcpy、memmove、memcmp、bcopy * 字符串和内存数据比较函数:strcmp、strcasecmp、strncasecmp、memcmp、strcoll、bcmp * 连接字符串的函数:strcat、strncat * ...

    c语言字符串操作(包括字符串各种操作)

    1. 字符串拷贝:strcpy()和memcpy() strcpy()函数只能拷贝字符串。strcpy()函数将源字符串的每个字节拷贝到目录字符串中,当遇到字符串末尾的null字符(\0)时,它会删去该字符,并结束拷贝。 memcpy()函数可以拷贝...

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

    #### 三、字符串拷贝函数:`memcpy`、`strcpy`与`strncpy` 除了基本的内存拷贝`memcpy`外,C/C++还提供了专门针对字符串拷贝的函数`strcpy`和`strncpy`。 1. **`memcpy`实现**(已讨论) 2. **`strcpy`实现**: ...

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

    本文将详细解析四种主要的字符串复制函数:`strcpy`、`strncpy`、`memcpy`以及`memmove`,帮助开发者更好地理解和使用这些函数。 1. `strcpy` 函数: `strcpy` 函数用于将源字符串(由`source`指向)完全复制到目标...

    一些c,c++,unix,RDBMS面试题,英文

    20. strncpy与memcpy:strncpy是C字符串库函数,用于安全地复制字符串,可以指定复制的字符数,但需要确保手动添加空终止符。memcpy是内存拷贝函数,不关心字符是否是字符串。 21. strcpy的缺点:不检查目标缓冲区...

    代码溢出初探

    此外,使用安全的字符串处理函数(如`strlcpy`或`memcpy`)也可以减少缓冲区溢出的风险。 总结来说,代码溢出是一种严重的安全问题,可以通过改进编程习惯、使用安全的编程技术以及实施输入验证等措施来预防。理解...

Global site tag (gtag.js) - Google Analytics