1.strcpy函数
char *strcpy(char* dest, const char *src);
strcpy 是依据 “\0” 作为结束判断的,会复制'\0'字符;如果dest 的空间不够,则会引起 buffer overflow。
2.strncpy函数
char *strncpy(char *dest, const char *src, int n);
当n>strlen(src)时,给dest不够数的空间里填充“\0”;当n<=strlen(src)时,dest是没有结束符“\0”的。
3.memcpy函数
void *memcpy(void *dest, const void *src, size_t n);
source和dest所指的内存区域可能重叠,但是如果source和dest所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向dest的指针.
memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;memcpy是根据其第3个参数决定复制的长度。
总结:使用strcpy时,dest指向的空间要大于等于src指向的空间;使用strncpy或memcpy时,n应该大于strlen(src),或者说最好n >= strlen(src)+1;这个1 就是最后的“\0”。
4.strcmp函数
int strcmp(const char *s1,const char *s2);
当s1<s2时,返回为负数;
当s1==s2时,返回值= 0;
当s1>s2时,返回正数。
两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
5.strncmp函数
int strncmp ( const char * str1, const char * str2, size_t n );
功能和strcmp类似,比较str1和str2字符串的前n个字符。
6.memcmp函数
int memcmp(const void *buf1, const void *buf2, unsigned int count);
memcmp是比较内存区域buf1和buf2的前count个字节。memcmp功能与strncmp几乎相同,但由于memcmp是以字节进行比较(ASCII码),故可处理特殊情况。例如,一个字符串中如有多个'\0'(ASCII码对应为数字0),strncmp函数遇到第一个'\0'就会停止,memcmp函数可全部比较。
7.memmove和memcpy的区别和实现
(1)函数说明
memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
(2)拷贝情况
拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:
1.当src内存区域和dst内存区域完全不重叠
2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前
3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。
(4)代码实现
memcpy函数
void* _memcpy(void* dest, const void* src, size_t count)
{
assert(src != nullptr&&dest != nullptr);
//判断dest指针和src指针是否为空,若为空抛出异常
char* tmp_dest = (char*)dest;
const char* tmp_src = (const char*)src;
//将指针dest和指针src由void强转为char,
//使得每次均是对内存中的一个字节进行拷贝
while (count--)
*tmp_dest++ = *tmp_src++;
return dest;
}
memove函数
void* _memmove(void* dest, const void* src, size_t count)
{
assert(src != nullptr&&dest != nullptr);
//判断dest指针和src指针是否为空,若为空抛出异常
char* tmp_dest = (char*)dest;
const char* tmp_src = (const char*)src;
if (tmp_src > tmp_dest)//当src地址大于dest地址时,从头进行拷贝
while (count--)
*tmp_dest++ = *tmp_src++;
else if (tmp_src < tmp_dest)//当src地址小于dest地址时,从后进行拷贝
{
tmp_src += count - 1;
tmp_dest += count - 1;
while (count--)
*tmp_dest-- = *tmp_src;
}
//else(tmp_src==tmp_dest) 此时不进行任何操作
return dest;
}
本文详细介绍了C语言中的字符串处理函数,如strcpy、strncpy、strcmp等,以及内存操作函数memcpy、memmove的使用方法和注意事项。通过对比不同函数的特点,帮助读者理解如何在各种场景下选择合适的方法。
610

被折叠的 条评论
为什么被折叠?



