文章目录
最开始没有C库,后来加入了官方标准库。
我们标准库中包含比如IO函数,字符串,和字符函数等。
标准库使用尖括号来包含
#include <stdlib.h>
通用工具库 <stdlib.h>
通用工具库包含各种函数,包括随机数生成器、查找和排序函数、转换 函数和内存管理函数。rand()、srand()、malloc()和free()函数。 在ANSI C标准中,这些函数的原型都在stdlib.h头文件中.
执行环境
void abort(void); //非正常终止一个正在执行的程序,并引发一个SIGNAL信号
void exit(int status); //调用此函数,则正常终止程序。如果程序以main函数作为返回值结束,那么最后将会将main的返回值传入该函数中并调用exit。
void atexit(void (func)(void)); //把传入的函数指针注册为退出函数,当函数正常终止或调用exit函数时会进入退出函数,退出函数不能接收参数。
exit()
exit()函数用于在程序运行的过程中随时结束程序,exit的参数state将会返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。exit(1)表示进程非正常退出. 返回 1给操作系统; exit(0)表示进程正常退出. 返回 0给操作系统.
在 main()返回系统时将自动调用exit()函数。
- return和exit()的另一个区别在于,即使在除main()之外的函数中调用exit(),它也将终止程序。
- abort()立即终止当前进程,产生异常程序终止,进程终止时不会销毁任何对象
atexit()
exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
atexit()函数 通过退出时注册被调用的函数提供这种功能,atexit()函数接受一个函数指针 作为参数。
/* atexit example */
#include <stdio.h> /* puts */
#include <stdlib.h> /* atexit */
void fnExit1 (void)
{
puts ("Exit function 1.");
}
void fnExit2 (void)
{
puts ("Exit function 2.");
}
int main ()
{
atexit (fnExit1);
atexit (fnExit2);
puts ("Main function.");
return 0;
}
//output:
//Main function.
//Exit function 2.
//Exit function 1
因为main函数结束时会调用exit函数,
atexit函数因为之前注册了两个函数,这时会分别调用这两个函数,调用顺序是栈的顺序,后进先出。
环境变量
环境变量是由编译器定义的名字列表比如SHAR=“on”,由操作系统维护。
getenv函数可以在这个列表中查找特定的名字,如果找到则返回一个指向其对应值的指针字符串。如果未找到则返回一个NULL指针。
char* getenv(char const* char);
系统命令
void system(char const* command);
我们可以调用此函数来向操作系统发送一个执行命令。比如ls
qsort()
断言库 <assert.h>
assert.h 头文件支持的断言库是一个用于辅助调试程序的小型库。
void assert(int expression);// if expression==0 则终止程序并打印错误信息
它由 assert()函数如果表达式求值为假,assert()宏就在标准错误流(stderr)中写入一条错误信息,并调用 abort()函数终止程序。、
当定义NDEBUG后,代码中所有断言将会失效,而无需一行一行将所有断言删除掉。
- 可以使用宏定义或者在编译选项中加入-DNDEBUG命令
- 或者使用宏定义 #define NDEBUG
可变参数列表 <stdarg.h>
信号 <signal.h>
日期和时间 <time.h>
数学库 <math.h>
字符串库 <string.h>
memcpy()
memove()