首页 > 编程语言 >C++面试,实现memcpy,strcpy这2个函数的功能

C++面试,实现memcpy,strcpy这2个函数的功能

时间:2024-03-04 22:35:07浏览次数:42  
标签:C++ char 复制 内存 strcpy 字符串 memcpy

`strcpy`和`memcpy`都是用于内存复制的函数,但它们之间有几个关键的区别:

1. **复制的对象**:
- `strcpy`主要用于复制字符串,它将从源字符串的起始位置开始复制字符,直到遇到源字符串的空字符('\0'),然后将空字符也复制到目标字符串中,表示字符串的结束。
- `memcpy`则是通用的内存复制函数,它可以复制任意类型的数据,不仅限于字符串。它将源内存区域中的字节逐个复制到目标内存区域,不考虑空字符或其他特殊字符。

2. **参数类型**:
- `strcpy`的参数是`char*`类型的指针,用于操作字符串。
- `memcpy`的参数是`void*`类型的指针,可以用于操作任意类型的数据。

3. **结束标志**:
- `strcpy`在复制字符串时会自动在目标字符串的末尾添加空字符,以标识字符串的结束。
- `memcpy`不会在复制数据后添加任何结束标志,它只是简单地按字节复制数据。

4. **安全性**:
- `strcpy`不会检查目标内存区域是否足够大来容纳源字符串,如果目标内存区域不够大,可能会导致内存溢出的问题。
- `memcpy`不做任何大小检查,需要确保目标内存区域足够大来容纳源内存区域的数据,否则可能会导致内存溢出。

因此,如果要复制字符串,通常使用`strcpy`更方便和安全。而如果需要复制非字符串数据,或者需要更灵活地控制复制过程,可以使用`memcpy`。

 

memcpy 的实现:

#include <iostream>

void* my_memcpy(void* destination, const void* source, size_t num) {
    // 强制类型转换为char*类型以实现字节级别的操作
    char* dest = static_cast<char*>(destination);
    const char* src = static_cast<const char*>(source);

    // 使用循环逐字节复制数据
    for (size_t i = 0; i < num; ++i) {
        dest[i] = src[i];
    }

    return destination;
}

// 定义一个结构体类型
struct Person {
    int id;
    char name[20];
    double salary;
};

int main() {
    // 创建一个Person结构体对象
    Person source = {123, "John Doe", 50000.0};

    // 创建一个Person结构体对象作为目标
    Person destination;

    // 使用自定义的my_memcpy函数拷贝结构体
    my_memcpy(&destination, &source, sizeof(Person));

    // 输出目标结构体的内容
    std::cout << "ID: " << destination.id << std::endl;
    std::cout << "Name: " << destination.name << std::endl;
    std::cout << "Salary: " << destination.salary << std::endl;

    return 0;
}

 

strcpy的实现:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <assert.h>
using namespace std;

char* strcpy(char* strDest, const char* strSrc)
{
    assert(strDest != NULL && strSrc != NULL);

    const char* ptrSrc = strSrc;
    char* ptrDest = strDest;

    while (ptrSrc != NULL && *ptrSrc != '\0')
    {
        *ptrDest++ = *ptrSrc++;
    }
    *ptrDest = '\0';
    return strDest;
}



int main()
{
    char *strSrc = "Test string.何亮到此一游.20191102.";
    char *strDest = new char[strlen(strSrc) + 1];
    strcpy(strDest, strSrc);
    cout << strDest << endl;


    cout << endl;
    system("pause");
    return 0;
}

 

标签:C++,char,复制,内存,strcpy,字符串,memcpy
From: https://www.cnblogs.com/music-liang/p/18052878

相关文章

  • 36C++语言级的四种类型转换
    C++语言级的四种类型转换const_cast:去掉常量属性的类型转换static_cast:提供编译器认为安全的类型转换reinterpret_cast:类似C风格的强制类型转化dynamic_cast:主要用在继承结构中,可以支持RTTI类型识别的上下转换#include<iostream>usingnamespacestd;classBas......
  • C++游戏飞翔的小鸟软件二次开发
    引言:在快节奏的现代生活中,人们总是在寻找一种方式来放松自己,释放内心的压力。游戏作为一种娱乐方式,早已深入人心。今天,我要向大家介绍的是一款简单而又充满挑战的小游戏——飞翔的小鸟。这款游戏的核心玩法是控制一只小鸟在无尽的天空中飞翔,通过点击屏幕使小鸟上升,避开各种障碍......
  • C++网上购书系统项目的二次开发 2252416 hzx
    1、来源:同学大二下的期末大作业:网上购书系统项目。2、运行环境:VisualStudio2019代码:点击查看代码#include"StdAfx.h"#include<iostream>#include"person.h"#include<string.h>#include"globalfunction.h"#include"book.h"#include"adm.h&......
  • c++在类外是不能直接调用私有成员函数的
    c++在类外是不能直接调用私有成员函数的,比如#include<iostream>usingnamespacestd;classA3{voidshow3(){cout<<"classA3"<<endl;//注意,类内部默认是私有}};intmain(){A3obj3;obj3.show3();//这里出错return0;}......
  • C++U6-06 - 一维线性动态规划
    上节课作业:链接:https://pan.baidu.com/s/17Fei1SuGEk5pnSspf_hprg?pwd=hq04提取码:hq04 动态规划  [最长上升子序列]  本题采用动态规划。数据储存,设定数组a[]用于存储数字序列,设定dp[]数组用于统计上升的序列个数;遍历组数a[],在遍历的过程中如果出现了数......
  • C++ mySQL数据库连接池(windows平台)
    C++MySQL数据库连接池新手学了C++多线程,看了些资料练手写了C++数据库连接池小项目,自己的源码地址关键技术点MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产......
  • C++ 简易STL 教程 与 C++ 标准库
    C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++提供了各种不......
  • C++U5-第06课-广度优先搜索3
    温故知新广搜的概念,编程实现基本流程 二进制矩阵中的最短路径]    【题意分析】找到一个从(0,0)到达(n-1,n-1)的路径并且路径上每一个数字都为0【思路分析】首先如果grid[0][0]=1,那么显然不存在最短路径,因此输出-1。使用dist[x][y]保存左上角单......
  • 【C++】【OpenCV-4.9.0】灰度图取反(Mat属性的使用)
    此次我们将一张图像转灰度后再进行灰度取反,即黑的变白的,白的变黑的,所以我们需要获取每个像素点上的灰度级,cv中提供了一个函数at,但是这个函数还有11个重载函数,太多了,我们只用这次需要用到的,即通过读取像素点的位置来获取灰度级。◆ at() [3/12]template<typename_Tp>c......
  • 提高C++编译速度
    提高C++编译速度BuildPerformanceInsights-Crascit如何分析和提高大型项目(C/C++)的编译速度?-知乎(zhihu.com)以上链接提供了提高编译速度的方案,以及如何检查是编译哪个文件花的时间最长。实践下来,我采用的方案是直接换用ninja来替代make,结合CMake计时参数,成功将......