Record and Summarize

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、double atof(const char *nptr);
(1)说明
  把字符串转换成浮点数。
(2)补充说明
  函数 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换(如果第一个非空格字符不存在或者不是数字也不是正负号则返回零),而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。
  返回值是返回转换后的浮点型数。
  附加说明 atof()与使用strtod(nptr,(char**)NULL)结果相同。

2、int atoi(const char *nptr);
(1)说明
  把字符串转换成整型数。
(2)补充说明
  参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
(3)atol
  即把字符串转换成长整型数,用法与atoi雷同

3、long int strtol(const char *nptr,char **endptr,int base);
(1)说明
  这个函数会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时,默认采用10进制做转换,但遇到如’0x’前置字符则会使用16进制做转换、遇到’0’前置字符而不是’0x’的时候会使用8进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回;若参数endptr为NULL,则会不返回非法字符串。
  如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数,并设置errno为ERANGE
(2)返回值
  如果第一个非空格字符不存在或者不是数字也不是正负号则返回零。
(3)unsigned long strtoul(const char *nptr,char **endptr,int base);
  说明同strtol。但要注意,该函数同样会识别nptr中的负号,要注意这一点。

4、随机数
函数一:int rand(void);
  从srand (seed)中指定的seed开始,返回一个[0,RAND_MAX(0x7fff)]间的随机整数。
函数二:void srand(unsigned seed);
  参数seed是rand()的种子,用来初始化rand()的起始值。
(1)说明
  系统在调用rand()之前都会自动调用srand(),如果用户在rand()之前曾调用过srand()给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值。如果给了一个定值,那么每次rand()产生的随机数序列都是一样的。
(2)常用的种子
  srand((unsigned)time(NULL)),即使用系统定时/计数器的值做为随机种子,这是最常用的种子。

5、void *malloc(unsigned int num_bytes);
(1)返回值
  如果分配成功则返回指向被分配内存的指针(不会对此存储去进行初始化操作),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

6、void *calloc(unsigned n,unsigned size);
(1)说明
  内存的动态存储区中分配n个长度为size的连续空间。
(2)返回值
  函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
(3)与malloc的区别
  函数返回一个指向分配起始地址的指针,如果分配不成功,返回NULL。calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

7、void *realloc(void *mem_address, unsigned int newsize);
(1)返回值
  如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 
(2)说明
  先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。
  注意:

  • newsize 一定要大于原来的大小不然的话会导致数据丢失!
  • realloc失败的时候,原来的内存不改变,不会释放也不会移动
  • 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露,因此在释放字符串数组是要注意。

8、void free(void *ptr)
(1)说明
  释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。
  不要重复释放。

9、void exit(int state)
(1)说明
  exit结束当前进程或当前程序,在整个程序中,只要调用 exit ,就结束。exit(0) 表示程序正常退出,exit(1)/exit(-1)表示程序异常退出。
(2)补充说明
  exit的执行会进入操作系统,即计算机此时处于管态,操作系统将对进程进行后期处理,包括收集进程状态信息,通知其父进程等,之后将回收进程所占有的所有资源(打开的文件,内存等),撤销其进程控制块。这样,组成进程的程序,数据,进程控制块就全部消失。

10、int system(const char * string);
(1)说明
  system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
(2)返回值
  ==-1: 出现错误
  ==0: 调用成功但是没有出现子进程
  >0: 成功退出的子进程的id
  如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。 如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
(3)补充说明
  当system接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl("/bin/sh", "sh", "-c", cmdstring,(char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了。
  看到这里你就会明白为什么system()会接受父进程的环境变量,但是用system改变环境变量后,system返回主函数后发现环境变量还是没变,原因从system的实现可以看到,它是通过产生新进程实现的,从我的分析中可以看到父进程和子进程间没有进程通信,子进程自然改变不了父进程的环境变量。
(4)附加说明
  在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

11、void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
(1)说明
  使用快速排序对数组进行排序
(2)参数
  base:待排序数组首地址 ;nelem:数组中待排序元素数量 ;width:各元素的占用空间大小 :fcmp:指向函数的指针,用于确定排序的顺序
(3)函数指针参数fcmp
  该函数是一个比较函数,一般使用如下写法(以int型数组为例为例):

// 两个参数的类型必须都是const void *。如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他类型也是如此;如果是降序,则与上所述正相反。在函数体内要对a,b进行强制类型转换后才能得到正确的返回值,不同的类型有不同的处理方法。
int comp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

12、void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));
(1)说明
  用二分搜索,因此必须是有序序列,一般先qsort再bsearch
(2)参数和返回值
  第一个:要查找的关键字。第二个:要查找的数组。第三个:指定数组中元素的数目。第四个:每个元素的长度(以字符为单位)。第五个:指向比较函数的指针。
  返回值是指向关键字的指针。如果要得到关键字的位置,只需要用返回值减去数组首地址即可(前提返回值的指针类型已经经过类型转换,即与数组首地址是相同指针类型)。
  如果没有匹配项,则返回NULL。

posted on 2013-12-30 15:43  zhangjing327  阅读(183)  评论(0编辑  收藏  举报