C语言中的strcpy,strncpy,memcpy,memmove,memset函数strcmp

char *strcpy(char *strDest,const char *strSrc)

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while(( *strDest++ = *strSrc++) != \’\\0\’);

return address;

}

//把src所指向的由NULL结束的字符串复制到dest所指的数组中

//src和dest所指内存区域不可以有重叠,且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。

//如果src的结尾不是‘\\0\’的话,系统会在src的结尾处自动加一个\’\\0\’

char array1[5]={\’1\’,\’2\’,\’3\’,\’4\’,\’5\’}; //没有以\’\\0\’结尾

char array2[5]={\’a\’,\’b\’,\’c\’}; //没有以\’\\0\’结尾

char *strncpy(char *dest, const char *src,size_t count)

{

assert((dest != NULL ) && (src != NULL));

char *temp=dest;

while(count– && (*dest++ = *src++) !=\’\\0\’);

return temp;

}

//把src所指由NULL结束的字符串的前n个字符串复制到dest所指的数组中

//如果src前n个字节不含NULL,则结果不会以‘\\0’字符结束

//如果src的长度小于n个字节,则以NULL填充到dest直到复制完n个字节

//src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串

//返回指向dest的指针

//如果只想显示复制的部分,就需要自己重新实现该函数,并且要加上\’\\0\’

void *memcpy(void *dest, const void *src, size_t count)

{

assert(dest != NULL && src != NULL);

char *tmp = dest;

const char*s = src;

while(counst–)

{

*tmp++ = *s++;

}

return dest;

}

//由src所指内存区域复制count个字节到dest所指内存区域

//src和dest所指内存区域不能重叠,函数返回指向dest的指针

//和strcpy相比,memecpy 不是遇到\’\\0\’就结束,而是一定会拷贝完n个字节

void *memmove(void *dst, const void *src, size_t count)

{

void *address = dst;

if (dst <= src || (char*)dst >= (char *)src + count)

{

while (count –)

{

*(char *)address = *(char *)src;

address = (char *)address + 1;

src = (char *)src + 1;

}

}

else

{

address = (char *)address + count – 1;

src = (char *)src + count – 1;

while (count –)

{

*(char *)address = *(char *)src;

address = (char *)address – 1;

src = (char *)src – 1;

}

}

return dst;

}

与memcpy类似,所不同的是,当对象重叠时,该函数仍能正确执行

void *memset(void *buffer,int c,int count)

{

char *buf =(char *)buffer;

assert(buffer != NULL);

while(count– > 0)

*buf++ = (char)c;

return buffer;

}

功能:将已开辟内存空间s的首n个字节的值设为值c。将s中的前n个字符替换为C,并返回s。

memset常用于内存空间的初始化。用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为memset(a,\’\\0\’,sizeof(a));

strcmp() 和 strncmp() 都是比较字符串的函数,比较字符串是否完全相同,区别在于能否比较指定长度字符串

两个字符串自左向右组个字符相比较(按ASCII值大小相比较),直到出现不同的字符或遇到\’\\0\’为止。

#include <string.h>

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n);

int strcmp(const char *str1,const char *str2)

{

/*不可用while(*str1++==*str2++)来比较,当不相等时仍会执行一次++,

return返回的比较值实际上是下一个字符。应将++放到循环体中进行。*/

while(*str1 == *str2)

{

if(*str1 == \’\\0\’)

return0;

str1++;

str2++;

}

return (*str1 – *str2);

}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

关于C语言中的memset()函数你了解多少

memset()函数原型为:

函数功能:将_Dst所指区域的前size_t个字节均初始化为_val,调用时需要引用string.h头文件

memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始化,如果没有对其进行初始化,常常会产生一些野值。

此外,读者可能对_cdcel和size_t比较陌生,这里稍微解释下,其中_cdecl表示C/C++和MFC程序默认使用的调用约定:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。(这里不详细说明,后续会写一篇关_cdecl、_stdcall、_fastcall的文章,读者可去我的主页查看),size_t是宏定义unsigned int或unsigned _int64的替换体

结果为:

memset 一般使用0初始化内存单元,需要注意的是,memset()函数是对size_t个字节进行赋值,而int类型为4个字节,如果写成这样便是错误的:

正确写法为:

这等价于例中的写法

通过memset()函数初始化要比挨个对结构体中成员初始化要方便很多。

如果是对结构体数组初始化的话:

错误1:sizeof(指针)

先来看一个例子:

大家觉得结果是什么?是“0 0 0 0 0 0 0 0 0 0”吗?

错误,结果应该是:

为什么会这样?因为str是指针变量,无论str指向的是什么类型的变量,str终究只是存储了地址,sizeof(str)永远等于4!所以我们只将前面4个字节置为0,而后面的-52应该是乱码的表示,因为后面六个字节是没有初始化的(关于-52知道的读者可以在评论区留言

我们平常可以通过指针或数组名来操控数组元素的值,如str[i],a[i],*(str+i)都是正确的写法,但务必记住的是指针和数组名不完全相同,具体区别我会另写一篇文章讲解。

错误2:多字节类型变量赋非0值与想像的不同

还是来看一个例子:

大家觉得结果是什么呢?是“1 1 1 1 1 1 1 1 1 1”吗?

正确答案为:

memset()函数赋值时,是对数组b的每个字节赋值,所以每个数组元素的值为:

转换为10进制便是16843009

觉得这篇文章对你有帮助的读者点个赞加关注吧,你的支持是我创作的动力

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。