memcpy 函数

memcpy 函数
memcpy 函数

memcpy

目录

函数原型

功能

所需头文件

返回值

说明

程序例

展开

函数原型

功能

所需头文件

返回值

说明

程序例

展开

函数原型

void *memcpy(void *dest, const void *src, size_t n);

功能

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

所需头文件

#include

返回值

函数返回dest的值。

说明

1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。

2.strcpy和memcpy主要有以下3方面的区别。

2.1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2.2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

2.3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

//注意,source和destin都不一定是数组,任意的可读写的空间均可。---wk

程序例

example1

作用:将s中的字符串复制到字符数组d中。

// memcpy.c

#include

#include

int main()

{

char *s="Golden Global View";

char d[20];

clrscr();

memcpy(d,s,(strlen(s)+1));

printf("%s",d);

getchar();

return 0;

}

输出结果:Golden Global View

example2

作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始)

#include

int main()

{

char *s="Golden Global View";

char d[20];

memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View)

//memcpy(d,s+14*sizeof(char),4*sizeof(char));也可

d[4]='\0';

printf("%s",d);

getchar();

return 0;

}

输出结果:View

example3

作用:复制后覆盖原有部分数据

#include

#include

int main(void)

{

char src[] = "******************************";

char dest[] = "abcdefghijlkmnopqrstuvwxyz0123as6";

printf("destination before memcpy: %s\n", dest);

memcpy(dest, src, strlen(src));

printf("destination after memcpy: %s\n", dest);

return 0;

}

输出结果:

destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6 destination after memcpy: ******************************as6

做游戏常用的函数

时间延迟函数 函数名: delay 功能: 将程序的执行暂停一段时间(毫秒) 用法: void delay(unsigned millis econds); 重画屏幕区域的函数 函数名:getimage 功能:将指定区域的一个位图存到主存中 用法:void far getimage( int left, int top, int right, int bottom, v oid far *bitmap); 函数名:putimage 功能:在屏幕上输出一个位图 用法:void far putimage( int x, i nt y, void far *bitmap, int op ); 图像大小函数

函数名: imagesize 功能: 返回保存位图像所需的字节数 用法: unsigned far imagesize( in t left, int top, int right, int bo ttom ); 异或模式函数 函数名: setwritemode 功能: 设置图形方式下画线的输出模式 用法: void far setwritemode(int mode); 参数MODE可以被设置位COPY_PUT 或者XOR_PUT两种模式。当mode被设置为XOR_PUT,其后的图形操作将都采用异或方式。此外之前提到的putimage()函数也可以采用异或模式向屏幕复制图像。 检测键盘输入函数 函数名: kbhit

功能: 检查当前按下的键 用法: int kbhit(void); 键盘接口函数 函数名: bioskey 功能: 直接使用BIOS服务的键盘接口用法: int bioskey(int cmd); 该函数通过bois中断0x16执行键盘操作,由参数cmd来决定具体的操作。Cmd 具体操作 0 读取按键的ascii码 1 测试是否有按键如果没有按键返回0 如果按键为ctrl+brk 返回-1 如果是其他按键返回按键本身键值(直到此按键被取出后恢复0) 2 返回shift key 状态 以下是当cmd为2的时候,返回值的具体含义 cmd返回值触发特殊键

memset函数使用详解

memset函数使用详解 今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般用于对字符型变量的初值进行赋值. 更详细的解说见百度百科--> https://www.360docs.net/doc/0615607694.html,/view/982208.htm 1。void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间s 的首n 个字节的值设为值c。 2。例子 #include void main(){ char *s="Golden Global View"; clrscr(); memset(s,'G',6); printf("%s",s); getchar(); return 0; } 3。memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); 4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a)); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b 的内存地址溢出。 5.补充:一点心得 memset可以方便的清空一个结构类型的变量或数组。 如:

strncpy函数的用法

strcpy ,strncpy ,strlcpy地用法 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界。 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式。 1. strcpy 我们知道,strcpy 是依据/0 作为结束判断的,如果to 的空间不够,则会引起buffer overflow。strcpy 常规的实现代码如下(来自OpenBSD 3.9): char * strcpy(char *to, const char *from) { char *save = to; for (; (*to = *from) != '/0'; ++from, ++to); return(save); } 但通常,我们的from 都来源于用户的输入,很可能是非常大的一个字符串,因此strcpy 不够安全。 2. strncpy 在ANSI C 中,strcpy 的安全版本是strncpy。 char *strncpy(char *s1, const char *s2, size_t n); 但strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定n 并不是sizeof(s1),而是要复制的char 的个数。一个最常见的问题,就是strncpy 并不帮你保证/0 结束。 char buf[8]; strncpy( buf, "abcdefgh", 8 ); 看这个程序,buf 将会被"abcdefgh" 填满,但却没有/0 结束符了。 另外,如果s2 的内容比较少,而n 又比较大的话,strncpy 将会把之间的空间都用/0 填充。这又出现了一个效率上的问题,如下: char buf[80]; strncpy( buf, "abcdefgh", 79 ); 上面的strncpy 会填写79 个char,而不仅仅是"abcdefgh" 本身。 strncpy 的标准用法为:(手工写上/0)

memcpy和memmove的区别与实现

区别:两个函数都是进行n字节内存内容的拷贝,入口参数和返回参数也都一样,可是这两个函数在内部实现上是有一定区别的,这主要是因为dest内存区域和src内存区域可能有一下四种不同的情况, 注意count的影响: 从图中可以看出,src的内存区域和dest的内存区域相对位置和重叠关系有四种情况,memcpy没有考虑重叠的情况,而memmove考虑到了全部情况,因此memcpy函数的时候可能出现意向不到的结果。 这两个函数的实现: ***********下面两个是错误的实现************** void* memcpy(void* dest, void* source, size_t count) { void* ret = dest; //copy from lower address to higher address while (count--) *dest++ = *source++; //不知道两个指针的类型,不可以这样自加。 return ret; }

void* memmove(void* dest, void* source, size_t count) { void* ret = dest; if (dest <= source || dest >= (source + count)) { //Non-Overlapping Buffers //copy from lower addresses to higher addresses while (count --) *dest++ = *source++; } else{ //Overlapping Buffers //copy from higher addresses to lower addresses dest += count - 1; source += count - 1; while (count--) *dest-- = *source--; // 情况同上 } return ret; } ***********************正确的如下************************** void* mymemcpy(void* dest, void* source, size_t count) { char*ret = (char*)dest; char*dest_t = ret; char*source_t = (char*)source; while (count--){ *dest_t++=*source_t++; } return ret; }

【重要】C++拷贝函数详解 20150111

C++拷贝函数详解 1.什么是拷贝构造函数: CA(const CA& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构 造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参 数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷 贝构造函数就会被自动调用。 也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数: ①程序中需要新建立一个对象,并用另一个同类的对象对它初始化,如前面介绍的那样。 ②当函数的参数为类的对象时。 在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就 是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参 完全相同的值。 ③函数的返回值是类的对象。 在函数调用完毕将返回值带回函数调用处时。 此时需要将函数中的对象复制一个临时对象并传给该函数的调用处。如 Box f( ) //函数f的类型为Box类类型 {Box box1(12,15,18); return box1; //返回值是Box类的对象 } int main( ) {Box box2; //定义Box类的对象box2 box2=f( ); //调用f函数,返回Box类的临时对象,并将它赋值给 box2 } 如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的 拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。 浅拷贝和深拷贝 在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的

memcpy函数详解

memcpy函数详解 1)memcpy函数用法解析 结构如下: void *memcpy( void *dest, const void *src, size_t count ); 作用: 在dest处拷贝src处的字节,并以count来计算需要拷贝的字节数量,进行内存的拷贝。 参数: dest:新的存贮区的开始部位src:需要拷贝的开始部位count:需要拷贝的字节数备注:dest,src,它们都是从各自的地址处进行写入,如果是p而不是&p,那么奖会取得p的值(地址),在该值的地址处进行读出或写入。 例: int* intPoint = new int(3333); int* intPoint1; memcpy( &intPoint1, &intPoint, 4 );//在intPoint1的地址处写入intPoint地址处的值,也就是intPoint指针值。 cout << *intPoint1 << endl;//使intPoint1指向了intPoint. 或 int* intPoint = new int(3333); int intPoint1; memcpy( &intPoint1, intPoint, 4 ); cout << intPoint1 << endl; 2)memcpy函数的实现与应用 memcpy函数较memmove相比,存在的不足是没有考虑到目的地址与源地址相重合,本文 对memcpy作了修改,弥补其不足。 memcpy函数的特点是: 1. 使用memcpy函数前,实参dest必须初始化,否则可能会出错,原因见2。 2. 函数原理是将void *src 强制转换为char *s,然后只负责拷贝n个字节到dest里,不

C常用操作函数

C++常用操作函数载入动态库 bool LoadDll() { HttpDownDll = LoadLibrary("HTTPDOWNDLL.dll"); if(HttpDownDll == NULL) { MessageBox(0, "载入动ˉ态库a错洙误ó!", "错洙误ó", MB_OK|MB_ICONWARNING); FreeLibrary(HttpDownDll); return false; } SendCommand = (SendCommandFunc)GetProcAddress(HttpDownDll, "SendCommand"); if(SendCommand == NULL) { MessageBox(0, "GetProcAddress错洙误ó!", "错洙误ó", MB_OK|MB_ICONWARNING); FreeLibrary(HttpDownDll); return false; } return true;

} 卸载动态库 bool FreeDll() { FreeLibrary(HttpDownDll); SendCommand = NULL; return true; } 字符串分割 std::vector split(std::string str,std::string pattern) { std::string::size_type pos; std::vector result; str+=pattern;//扩展1字符串以方便操ù作痢 int size=str.size(); for(int i=0; i

memcpy

memcpy 函数原型 void *memcpy(void *dest, const void *src, size_t n); 功能 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中 所需头文件 #include 返回值 函数返回dest的值。 说明 1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。 2.strcpy和memcpy主要有以下3方面的区别。 2.1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。 2.2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。 2.3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy 3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。 //注意,source和destin都不一定是数组,任意的可读写的空间均可。---wk 编辑本段程序例 example1 作用:将s中的字符串复制到字符数组d中。

// memcpy.c #include #include int main() { char *s="Golden Global View"; char d[20]; clrscr(); memcpy(d,s,(strlen(s)+1)); printf("%s",d); getchar(); return 0; } 输出结果:Golden Global View example2 作用:将s中第14个字符开始的4个连续字符复制到d中。(从0开始) #include int main() { char *s="Golden Global View"; char d[20]; memcpy(d,s+14,4); //从第14个字符(V)开始复制,连续复制4个字符(View) //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可 d[4]='\0'; printf("%s",d); getchar(); return 0; } 输出结果:View example3 作用:复制后覆盖原有部分数据 #include #include int main(void) {

实现Memcpy函数

面试中面试官经常会让写程序,根据题目的难度会在算法和编程习惯上各有侧重。比如写一个memcpy函数,这个题算法简单明确,因此重点考察编程习惯、工程思想。 该题目的算法如下 void memcpy(void *dst, void *src, int count) { while(count--) { *dst = *src; dst++; src++; } } 问题是void*不能直接累加*dst = *src也是不对的。 void memcpy(void *dst, void *src, int count) { unsigned char *pdst = (unsigned char *)dst; unsigned char *psrc = (unsigned char *)src; while(count--) { *pdst = *psrc; pdst++; psrc++; } } 在32位系统中,可复制的最多内存是多少?类型会不会不够用?内存复制不应该修改原始内存吧。 因此,函数声明修改如下void memcpy(void *dst, const void *src, size_t count) 这样就万事大吉了吗?如果传入了空指针呢? 接着修改吧 void memcpy(void *dst, const void *src, size_t count) { assert(dst != NULL); assert(src != NULL); unsigned char *pdst = (unsigned char *)dst; const unsigned char *psrc = (const unsigned char *)src; while(count--) { *pdst = *psrc; pdst++; psrc++; } } 如果有这样的数组char ina[]={0,1,2,3,4,5,6,7,8,9,10,11}; 进行如下调用memcpy(&ina[1], &ina[0], 5);会发生什么情况?由于原始数据和目的数据在空间上存在重叠,这样导致复制过

常见系统函数

1.//*********************************************************************** char* reverse(char* Array) { int len = strlen(Array); for(int i=0;i

void的在函数和变量中详解

void含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义,不妨试着定义:void a; 这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。 void真正发挥的作用在于: (1)对函数返回的限定; (2)对函数参数的限定。 众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 例如: float *p1; int *p2; p1 = p2; 其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:p1 = (float *)p2; 而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: void *p1; int *p2; p1 = p2; 但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面语句编译出错: void *p1; int *p2; p2 = p1; 提示“'=' : cannot convert from 'void *' to 'int *'”。 编辑本段void的使用 下面给出void关键字的使用规则: 规则一 如果函数没有返回值,那么应声明为void类型 在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如: add ( int a, int b ) { return a + b; }

memmove、memcpy和memccpy简介

函数简介:memmove、memcpy和memccpy简介 函数实现:strcpy()、memcpy()、memmove()、memset()的实现 memmove、memcpy和memccpy简介 memmove、memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区。 memmove(void *dest,void*src,int count) memcpy(void *dest,void *src,int count) memccpy(void*dest,void*src,int ch,int count) 表头文件: #include 定义函数: void *memcpy(void *dest, const void *src, size_t n) 函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束 返回值: 返回指向dest的指针 表头文件: #include 定义函数: void *memccpy(void *dest, const void *src, int c, size_t n); 函数说明: memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,memccpy()如果在src中遇到某个特定值(int c)立即停止复制。 返回值: 返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。 表头文件: #include 定义函数: void *memmove(void *dest, const void *src, size_t n); 函数说明:memmove()是从一个缓冲区移动到另一个缓冲区中。 返回值: 返回指向dest指针。 当dest <= src-count 或dest >= src+count时,以上三个函数均不会产生覆盖问题,即源数据不会被更改。

C语言中常用函数大全

(一)输入输出常用函数 1,printf (1)有符号int %[-][+][0][width][.precision][l][h] d -:左对齐 +:正数前加‘+’ 0:右对齐,acwidth.precision,按实际输出,否者左边补零 (2)无符号int %[-][#][0][width][.precision][l][h] u|o|x|X #:”%o %x/X”输出0,0x,0X .precision:同上,TC/BC包含0x/X,VC下不包含 (3)实数输出 %[-][+][#][0][width][.precision][l][L] f|e|E|g|G #:必须输出小数点 .precision:小数位数(四舍五入) (4)字符和字符串的输出 %[-][0][width] c %[-][0][width] [.precision] s .precision:S的前precision位 2,scanf %[*][width] [l][h]Type With:指定输入数据的宽度,遇空格、Tab、\n结束 *:抑制符scanf(“%2d%*2d%3d”,&num1,&num2) 输入123456789\n;num1==12,num2==567. 注意: (1)指定width时,读取相应width位,但按需赋值 Scanf(“%3c%3c”,&ch1,&ch2)输入a bc d efg ch1==a ch2==d (2)%c 输入单字符时“空格、转义字符”均是有效字符 (二)ascll字符/字符串/文件函数 1;字符非格式化输入函数 (1)int getchar(void) 接受字符,以回车结束,回显 (2)int getc(FILE*stream) 从stream中接受字符,以回车结束,回显stream=stdin时,(1)==(2)(3)int getche(void) 直接读取字符,回显conio.h

memset函数

功能 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。 用法 void *memset(void *s, int ch, unsigned n); 程序例 #include #include #include int main(void) { char buffer[] = "Hello world\n"; printf("Buffer before memset: %s\n", buffer); memset(buffer, '*', strlen(buffer) ); printf("Buffer after memset: %s\n", buffer); printf("%d",strlen(buffer)); return 0; }编译平台:Microsoft Visual C++ 6.0 也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。 例如下面这样: #include #include #include int main(void) { int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<

C语言函数大全(精简版)

字符串函数?bcmp ?bcopy ?bzero ?memccpy ?memchr ?memcmp ?memcpy ?memicmp ?memmove ?memset ?movmem ?setmem ?stpcpy ?strcat ?strchr ?strcmp ?strcmpi ?strcpy ?strcspn ?strdup ?stricmp ?strlen ?strlwr ?strncat ?strncmp ?strncmpi ?strncpy ?strnicmp ?strpbrk ?strrev ?strset ?strstr ?strtok ?strupr 数学函数 ?abs ?acos ?asin ?atan ?atan2 ?ceil ?cos ?cosh ?exp ?fabs ?floor ?fmod ?frexp ?hypot ?ldexp ?log ?log10 ?modf ?pow ?pow10 ?sin ?sinh ?sqrt ?tan ?tanh 输入输出函数 ?getchar ?kbhit ?printf ?putchar 系统函数 ?exit ?itoa 字符函数 ?isalnum ?isalpha ?iscntrl ?isdigit ?islower ?isascii ?isgraph ?isprint ?ispunct ?isspace ?isupper ?isxdigit ?toascii ?tolower ?toupper 内存管理函数 ?calloc ?free ?malloc ?realloc

ctype.h 字符函数 isalnum 功能:判断字符c是否为字母或数字 说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,isalnum(c)?"yes":"no"); isalpha 功能:判断字符c是否为英文字母 说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。 举例: printf("%c: %s letter",c,isalpha(c)?"is":"not"); iscntrl 功能:判断字符c是否为控制字符 说明:当c在0x00-0x1F之间或等于0x7F(DEL)时,返回非零值,否则返回零。 举例: printf("%x:%s\n",c,iscntrl(c)?"yes":"no"); isdigit 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,isdigit(c)?"yes":"no"); islower 功能:判断字符c是否为小写英文字母 说明:当c为小写英文字母(a-z)时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,islower(c)?"yes":"no"); isascii 功能:判断字符c是否为ascii码 说明:当c为ascii码时,返回非零值,否则返回零。ascii码指0x00-0x7F之间的字符举例: if(isascii(s[i])) putchar('^');

相关mem-(c语言)

P174 (3)使用memset函数来赋值。 标准库函数memset可实现对某内村快的个字节单元整体赋同样的值。 Memset函数原型如下: void*memset (void*s, char ch, unsigned n) memset函数主要适合于字节型数组的整体赋值,当然对非字节型数组进行清零也是可以的。 例如,下面的程序是将数组str的第个数据单元赋值为’a’; char str [10]; memset (str, ‘a’, 10); 再例如,下面的程序是将数组a的每个数据单元赋值为0(清零):Int a[10]; Memset (a,0, 10*sizeof(int)) 下面程序执行之后数组a的各元素值为2 -short a[10]; -memset(a, 2, 10*sizeof(short)); (4)使用memcpy函数实现数组间的赋值。 对于两个数据类型和大小相同的数组,如果将其中一个数组个单元的值要赋值给另一个数组的各数据单元,我们也许首先会想到用循环的方式来解决,例如: -int a[5]={1,2,3,4,5},b[5],i;

-for (i=0;i<5;i++) --b[i]=a[i]; 有一个更加简便的方法(-memcpy(b,a,5*sizeof(int));),就是使用memcpy库函数,该函数的原型如下: V oid*memcpy(void*d,void*s,unsigned n) 要复制的数组在前原数组在后,还有有数的类型。 注意:在使用memset和mecpy函数时,源程序中要包含头文件“string.h”。在vc下,则也可用“memory.h”。

memset ()函数

memset 求助编辑 memset 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。 目录 需要的头文件 or 函数原型 void *memset(void *s, int ch, unsigned n);memset原型 (please type "man memset" in your shell) void *memset(void *s, int c, size_t n);

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。 常见的三种错误 第一: 搞反了c 和 n的位置. 一定要记住如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 而不是 memset(a, 20, 0) 第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧 怕未经初始化的内存, 所以他们会写出这样的代码: char buffer[20]; memset(buffer, 0, sizeof((char)*20)); strcpy(buffer, "123"); 这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义. 第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现 int some_func(struct something *a){ … … memset(a, 0, sizeof(a)); … } 问:为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。 答:1.如果不清空,可能会在测试当中出现野值。你做下面的试验看看结果() char buf[5]; CString str,str1; //memset(buf,0,sizeof(buf)); for(int i = 0;i& lt;5;i++) { str.Format(“%d “,buf[i]); str1 +=str ;} TRACE(“%s\r \n“,str1) 2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码) 问: 如下demo是可以的,能把数组中的元素值都设置成字符1, #include

C++常用函数

C++常用函数 1、常用数学函数 头文件#include 或者#include 函数原型功能返回值 int abs(int x) 求整数x的绝对值绝对值 double acos(double x) 计算arcos(x)的值计算结果 double asin(double x) 计算arsin(x)的值计算结果 double atan(double x) 计算arctan(x)的值计算结果 double cos(double x) 计算cos(x)的值计算结果 double cosh(double x) 计算x的双曲余弦cosh(x)的值计算结果 double exp(double x) 求的值计算结果 double fabs(double x) 求实数x的绝对值绝对值 double fmod(double x) 求x/y的余数余数的双精度数 long labs(long x) 求长整型数的绝对值绝对值 double log(double x) 计算In(x)的值计算结果 double log10(double x) 计算的值计算结果 double modf(double x, double *y) 取x的整数部分送到y所指向的单元格中x的小数部分double pow(double x, double y) 求x的y次幂的值计算结果 double sin(double x) 计算sin(x)的值计算结果 double sqrt(double x) 求的值计算结果 double tan(double x) 计算tan(x)的值计算结果 fcvt 将浮点型数转化为字符串 2、常用字符串处理函数 头文件#include 或者#include 函数原型功能返回值 void *memcpy(void *p1, const void *p2 size_t n) 存储器拷贝,将p2所指向的共n个字节拷贝到p1所指向的存储区中目的存储区的起始地址 (实现任意数据类型之间的拷贝) void *memset(void *p int v, size_t n) 将v的值作为p所指向的区域的值,n是p所指向区

c语言中常用函数大全

如对您有帮助,请购买打赏,谢谢您! (一)输入输出常用函数 1,printf (1)有符号int %[-][+][0][width][.precision][l][h] d -:左对齐 +:正数前加‘+’ 0:右对齐,acwidth.precision,按实际输出,否者左边补零 (2)无符号int %[-][#][0][width][.precision][l][h] u|o|x|X #:”%o %x/X”输出0,0x,0X .precision:同上,TC/BC包含0x/X,VC下不包含 (3)实数输出 %[-][+][#][0][width][.precision][l][L] f|e|E|g|G #:必须输出小数点 .precision:小数位数(四舍五入) (4)字符和字符串的输出 %[-][0][width] c %[-][0][width] [.precision] s .precision:S的前precision位 2,scanf %[*][width] [l][h]Type With:指定输入数据的宽度,遇空格、Tab、\n结束 *:抑制符scanf(“%2d%*2d%3d”,&num1,&num2) 输入9\n;num1==12,num2==567. 注意: (1)指定width时,读取相应width位,但按需赋值 Scanf(“%3c%3c”,&ch1,&ch2)输入a bc d efg ch1==a ch2==d (2)%c 输入单字符时“空格、转义字符”均是有效字符 (二)ascll字符/字符串/文件函数 1;字符非格式化输入函数 (1)int getchar(void) 接受字符,以回车结束,回显 (2)int getc(FILE*stream) 从stream中接受字符,以回车结束,回显stream=stdin时,(1)==(2) (3)int getche(void) 直接读取字符,回显conio.h (4)int getchar(void) 直接读取字符,不回显conio.h

1 写一个函数,完成内存之间的拷贝[考虑问题是否全面]

1. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面] void* mymemcpy( void *dest, const void *src, size_t count ) { char* pdest = static_cast( dest ); const char* psrc = static_cast( src ); if( pdest>psrc && pdest='a'&&*s<='z') *us = *s-32; else *us = *s; } *us = '\0'; } void main() { char *s,*us; char ss[20];

相关主题
相关文档
最新文档