容易混淆的几个函数:
(1)memset
函数原型:void *memset(void *s, int ch, size_t n)
解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s
作用:是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
应用:如果要把一个char a[20]清零,一定是 memset(a,0,20);
举例:
charbuffer[4];
memset(buffer,0,sizeof(char)*4);
strcpy(buffer,"123");
/
///"123"中最后隐藏的'\0'占一位,总长4位。
这里的
memset
是多余的. 因为这块内存马上就被全部覆盖,清零没有意义。
charbuffer[20];
memset(buffer,0,sizeof(char)*20);
memcpy(buffer,"123",3);
/
///这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
///用printf打印buffer会有乱码甚至会出现段错误。
///如果此处是strcpy(buffer,"123");便不用memset,strcpy虽然不会覆盖buffer但是会拷贝字符串结束符
这种情况下memset并不多余,因某些
编译器
分配空间时,内存中默认值并不为0:
用memset对非字符型
数组赋初值是不可取的!
例如有一个
结构体Some x,可以这样清零:
memset(&x,0,sizeof(Some));
memset(x,0,sizeof(Some)*10);
(2)fwrite 参考:http://blog.chinaunix.net/uid-10747583-id-120041.html
fwrite (buffer , sizeof(buffer), 1 , pFile );
(3)itoa、atoi、atof、atoi,atol,strtod,strtol,strtoul
itoa是广泛应用的非标准C语言扩展函数。由于它不是标准C语言函数,所以不能在所有的编译器中使用。但是,大多数的编译器(如Windows上的)通常在<stdlib.h>头文件中包含这个函数。
char* itoa(int value,char* string,int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等
举例:
#include<stdlib.h>
#include<stdio.h>
intmain()
{
int number=123456;
char string[25];
itoa(number,string,10);
printf("integer=%dstring=%s\n",number,string);
return 0;
}
atof: 把字符串转换成浮点数
#include<stdlib.h>
#include<stdio.h>
intmain()
{
doubled;
char*str="12345.67";
d=atof(str);
printf("string=%sdouble=%lf\n",str,d);
return0;
}