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
文章为作者独立观点不代本网立场,未经允许不得转载。