写一个函数,完成内存之间的拷贝。[考虑问题是否全面,是否考虑内存重叠问题]
返回void *支持链式操作,参数类型是void *以支持任意类型的指针,输入参数加上const修饰,最好加上assert对输入输出指针进行非NULL判断
void* memcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast<char*>( dest );
const char* psrc = static_cast<const char*>( src );
// 依次从前拷贝,目的地址覆盖了源地址的数,此时从后往前拷贝
if( (pdest>psrc) && (pdest<(psrc+count))) //能考虑到这种情况就行了
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i<count; ++i )
pdest[i] = psrc[i];
}
return dest;
}
int main( void )
{
char str[] = "0123456789";
memcpy( str+1, str+0, 9 );
cout << str << endl;
memcpy( str, str+5, 5 );
cout << str << endl;
system( "Pause" );
return 0;
// 0012345678
// 4567845678
}
strcmp():
Int simple_strcmp (const char *s1, const char *s2)
{ int ret;
while ((ret = *(unsigned char *) s1 - *(unsigned char *) s2++) == 0
&& *s1++);
return ret;
}
memcmp():
int simple_memcmp (const char *s1, const char *s2, size_t n)
{ int ret = 0;
while (n--&& (ret = *(unsigned char *) s1++ - *(unsigned char *) s2++) == 0);
return ret;
}
strcmp只判断s1的‘/0’,没有长度的控制;memcmp有长度参数n的控制
memcpy():
char *simple_memcpy (char *dst, const char *src, size_t n)
{ char *ret = dst;
while (n--)
*dst++ = *src++;
return ret;
}
直接的内存之间的copy,不处理内存重叠的情况。
strcpy():
char *simple_strcpy (char *dst, const char *src)
{ char *ret = dst;
while ((*dst++ = *src++) != '\0'); //相当简约,一句话即搞定
return ret;
}
与memcpy区别就是对'\0'作为结束符
strncpy():
char *simple_strncpy (char *dst, const char *src, size_t n)
{
char *ret = dst;
while (n--)
{
if ((*dst++ = *src++) == '\0')
{
while (n--)
*dst++ = '\0';
return ret;
}
}
return ret;
}
n和‘\0'都作为结束的控制符。如果n过大,则后面全补'\0'
分享到:
相关推荐
本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。 许多面试题看似简单,却需要深厚的基本功才能给出...
其中,空闲分区通过空闲分区链表来管理,分别采用首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。 基本功能:设计与实现...
关于 C/C++ 面试考题总结的。里面收集很多算法跟知识点的讲解
C语言字符串函数大全C/C++基础 函数名: stpcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例: #include <stdio.h> #include <string.h> int main(void) ...
c/c++算法实现多路pcm混音源码
用C/C++实现的各种经典算法以及常见面试题
用C语言实现multipart/form-data文件上传,没有用到curl之类的库。之前做个小的日志上传程序写的。
#二维码(QRcode)生成算法 C语言/C++ 源码 1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和...
C/C++ 标准库函数手册。 包含大部分常用的标准库函数、标准模版库和关键字等描述。
操作系统 循环首次适应算法 首次适应算法 最佳适应算法 回收内存 分配内存设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法: 首次适应算法 循环首次...
Verilog/C++实现排序算法:Verilog/C++实现排序算法:冒泡排序、选择排序、并行全比较排序、串行全比较排序。
C_C++ 内存管理算法和实现 Memory Management Algorithms and Implementation in C_C++ <br/>C_C++ 内存管理算法和实现 Memory Management Algorithms and Implementation in C_C++ <br/>C_C++ 内存管理算法和实现 ...
算法I-IV (C++实现)---带目录.part1
算法I-IV (C++实现)---带目录.part5
C/C++手撕代码 最短路径 Dijkstra算法与Floyd算法-C/C++手撕代码算法实现 最短路径算法实现 Dijkstra算法实现 Floyd算法实现
最近需要和银行pos做数据通讯,银行端算法为java实现的 AES/ECB/PKCS5PADDING我也改不了, c/c++这边实现ECB算法本来就少,PKCS5PADDING的更是没有,索性自己动手。工作原因c和java都得熟悉,因此把java端和c/c++...
程序员面试宝典(C/C++&数据结构&网络&数据库&操作系统)
本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序...
Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions All C Functions C++ C++ I/O C++ Strings C++ String Streams ...