1. memcpy函数原型:
void* memcpy(void* dst, const void* src, size_t size);
void* memmove(void* dst, const void* src, size_t size);
分析:
- source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
- 如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
- 注意:source和destin都不一定是数组,任意的可读写的空间均可。
函数实现:
void* memcpy(void* dst, const void* src, size_t size)
{
if(dst == NULL || src == NULL)
{
return NULL;
}
void* res = dst;
char* pdst = (char*)dst;
char* psrc = (char*)src;
if(pdst > psrc && pdst < psrc + size) //重叠
{
pdst = pdst + size - 1;
psrc = pdst + size - 1;
while(size--)
*pdst-- = *psrc--;
}
else //无重叠
{
while(size--)
*dst++ = *src++;
}
return ret;
}
2. strpcy函数原型:
char *strcpy(char *dest, const char *src);
分析:
- dest:指向用于存储复制内容的目标数组。
- src:要复制的字符串。
- 返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
函数实现:
char* strcpy(char* dst, const char* src)
{
assert((dst != NULL) && (src != NULL));
char* ret = dst;
int size = strlen(src) + 1;
if(dst > src || dst < src + len)
{
dst = dst + size - 1;
src = src + size - 1;
while(size--) *dst-- = *src--;
}
else
{
while(size--) *dst++ = *src++;
}
return ret;
}
3. 手写strcat函数
char* strcat(char* dst, const char* src)
{
char* ret = dst;
while(*dst != '\0')
++dst;
while((*dst++ = *src) != '\0');
return ret;
}
4. strcmp函数原型:
int strcmp(const char *s1, const char *s2);
返回值:
- 若s1、s2字符串相等,则返回零;
- 若s1大于s2,则返回大于零的数;否则,则返回小于零的数。
- 说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。
函数实现:
int strcmp(const char* str1, const char* str2)
{
while(*str1 == *str2 && *str1 != '\0')
{
++str1;
++str2;
}
return *str1 - *str2;
}
5. 如何判断两个结构体是否相等?
- 判断两个结构体是否相等:重载操作符"=="
- 不能用函数memcmp来判断两个结构体是否相等:memcmp函数是逐个字节进行比较的,而struct存在字节对齐,字节对齐时补的字节内容是随机的,会产生垃圾值,所以无法比较。
int memcmp(const void *buf1, const void *buf2, unsigned int count);
分析:比较内存区域buf1和buf2的前count个字节。
返回值:
- 当buf1<buf2时,返回值小于0
- 当buf1==buf2时,返回值=0
- 当buf1>buf2时,返回值大于0
测试代码:
#include<iostream>
using namespace std;
struct s
{
int a;
int b;
bool operator == (const s &rhs);
};
bool s::operator == (const s &rhs)
{
return ((a == rhs.a) && (b == rhs.b));
}
int main()
{
struct s s1, s2;
s1.a = 1;
s1.b = 2;
s2.a = 1;
s2.b = 2;
if (s1 == s2)
cout << "两个结构体相等" << endl;
else
cout << "两个结构体不相等" << endl;
return 0;
}
参考资料:
1.