C语言从头学63—学习头文件stdlib.h(二)
6、随机数函数rand()
功能:产生0~RAND_MAX 之间的随机整数。
使用格式:rand(); //无参
返回值:返回随机整数
说明:
a.RAND_MAX是一个定义在stdlib.h里面的宏,表示可以产生的最大随机整数;
b.如需要获得整数 a 到 b 之间的随机数(包括a、b),可以使用下面的公式:
int r = rand()%(b-a+1)+a;。
c.使用rand()函数还要配套使用随机数种子函数(下面介绍),否则每次输出的随机数顺序都会相同,失去了随机数的意义。
7、随机数种子函数srand()
功能:重置随机数种子值
使用格式:srand(参1);
参1:使用无符号整数作为种子值,为增加随机性,一般使用随时变化的time(NULL)函数返回的秒数做为种子值
返回值:无
说明:种子函数srand要在随机数函数rand()前面调用才会发生作用。
8、终止程序函数abort()
功能:触发SIGABRT信号,终止程序
使用格式:abort(); //无参
返回值:无
说明:abort函数触发信号SIGABRT后,有两种情况:如无自定义信号处理程序,则调用默认信号处理程序,然后结束程序;如有自定义信号处理程序,则在执行默认信号处理程序后,会进入自定义信号处理程序,然后再结束程序。总之,不会再返回主程序,这一点与raise()函数发出信号的结果不同。
9、退出当前执行程序函数 exit()、quick_exit()、_Exit()
功能:退出当前正在执行的程序
使用格式: exit(参1);
quick_exit(参1);
_Exit(参1);
参1:程序的退出状态:0正常退出,非零发生错误退出;也可使用宏EXIT_SUCCESS和EXIT_FAILURE当作参数
说明:
a. 上面三个退出程序函数的区别:exit()是正常退出,系统会做完整的清理;quick_exit() 是快速退出,清理工作少一些;_Exit() 是立即退出,不做清理工作。
b. 退出程序函数退出的是整个程序,不是某一个具体函数;无论在程序的任何地方,遇到上面三个函数,程序都会立即结束。
10、退出前处理函数 atexit()、at_quick_exit()
功能:程序退出前需要执行的一些函数通过这两个函数进行登记,以便程序退出前予以调用。
使用格式:atexit(参1);
at_quick_exit(参1);
参1:要执行的函数地址(函数名)。
返回值:调用成功时返回0 ,调用失败时返回非零值
说明:
a.在函数atexit()中登记的函数,只有调用exit()退出或main()退出时才会执行;同样,在函数at_quick_exit()中登记的函数只有在调用quick_exit()退出时才会执行;也就是说,atexit与exit、at_quick_exit与quick_exit要成对使用。
b.这些函数要在exit或quick_exit前使用,而且可以多次使用;多次使用时,执行顺序是挨着exit()近的先执行。
c.要调用的函数必须是无参、无返回值的。
以上函数的实验程序如下:
#include<stdio.h>
#include<time.h> //随机数种子函数
#include<stdlib.h>
#include<signal.h>
void handle(int x)
{
printf("按回车键lllll继续...\n");
getchar();
}
void myPrint()
{
printf("myPrint函数被调用了。。。\n");
getchar();
exit(EXIT_SUCCESS);
}
void myAtexit()
{
printf("myAtexit函数被执行了\n");
getchar();
}
int main(void)
{
//生成10个0-100间的随机整数
srand(time(0));
for (int i = 0; i < 10; i++)
{
int r = rand() % (100 - 0 + 1) + 0;
//生成0-100之间的10个随机整数
printf("%d - %d ",i,r);
}
//运行结果:0 - 92 1 - 55 2 - 26 3 - 41 4 - 17 5 - 32 6 - 80 7 - 69 8 - 1 9 - 93
//实验abort()函数
signal(SIGABRT, handle);
//abort(); //注释掉,否则后面的代码无法运行
//实验exit()
//myPrint(); //这个函数中有exit()的调用
printf("这里是主程序...\n");
//实验atexit()函数
atexit(myAtexit);
exit(EXIT_FAILURE); //如果仅注释掉这一行,myAtexit仍会被调用,main函数正常退出也调用atexit函数
getchar();
return 0;
}