这组函数返回整型值。这些函数分为3类:算术,随机数,和字符串转换。
16.1.1 算术标准函数库包含了4个整型算术函数:
int abc( int value ); //返回它参数的绝对值-整型 long int labs( long int value ); //放回它参数的绝对值-长整型 div_t div( int numerator, int denominator ); ldiv_t ldiv( long int numer, long int denom );
div函数把它的第一个参数除以第二个参数,然后用一个div_t结构返回结果。这个结构包括两个字段:
int quot;//商 int rem;//余数
16.1.2 随机数下面两个函数可以产生伪随机数(pseudo-random number)。
int rand ( void ); //返回一个范围在 0~RAND_MAX(至少为32767)之间的伪随机数。它的随机序列是相同的. void srand( unsigned int seed );//避免程序每次运行时获得相同的随机序列,可使用每天的时间作为随机数产生器的seed。
例子:srand( (unsigned int)time( 0 ) );
实例:
#include16.1.3 字符串转换#include #define TURE 1 #define FALSE 0 void shuffle( int *deck, int n_cards ) { int i; static int first_time = TURE; if( first_time == TURE) { first_time = FALSE; srand( (unsigned int)time( NULL) ); } for( i = n_cards - 1; i > 0; i -= 1 ){ int where; int temp; where = rand() % i; //为了得到一个更小范围的伪随机数,首先对它返回值取模,后加或减一个偏移量调整。 temp = deck[where]; deck[where] = deck[i]; deck[i] = temp; } }
字符串转换函数把字符串转换为数值。atoi,taol函数 用于执行基数为10的转换。strol,stroul函数 允许在转换时指定基数,同时还允许访问字符串的剩余部分。
int atoi( char const *string ); long int atol( char const *string ); long int strtol( char const *string, char **unused, int base ); //名字解读:string to long int unsigned long int strtoul( char const *string, char **unused, int base ); //base-基数 double atof(char const *string ); double strtod( char const *string, char **unused );
例子:x = strtol( " 590bear", next, 12 ); 的返回值9947(590b,基数为12,转换为10进制为9947。前导的的空白符被忽略),并把一个指向字符e的指针保存在 next所指的变量中。转换在b处停止,因为e在基数为12时e不是一个合法的数字。
16.2 浮点型函数**头文件
注意定义域错误(domain error) :一个函数的参数不在这个函数的定义域之内,如求一个负数的平方根 sqrt( -5.0 );
当一个定义域错误时,函数返回一个由编译器定义的错误值,并且在errno中存储这个EDOM。
范围错误(range error) :一个函数的结果太大或者太小无法用double类型表示。如:exp( DBL_MAX ); 这时函数会返回HUGE_VAL,它是一个在math.h中定义的double类型的变量。太小时返回0值。errno被置为ERANG.
16.2.1 三角函数常见的三角函数原型:
double sin( double angle ); //angle 单位为弧度 double cos( double angle ); double tan( double angle ); double asin( double value ); //反正弦函数 double acos( double value ); double atan( double value ); double atan2( double x, double y ); // y/x的反正切值16.2.2 双曲函数
原型如下:
double sinh( double angle ); //返回双曲正弦值 double cosh( double angle ); double tanh( double angle );16.2.3 对数和指数函数
原型如下:
double exp ( double x ); //返回e值得X次幂 double log ( double x ); //返回x以e为底的对数 double log10(double x ); //返回x以10为底的对数16.2.4 浮点数表示形式
下面3个函数根据编译器定义的格式来存储浮点值:
double frexp( double value, int *exponent ); //在格式不兼容的机器之间有用。 double ldexp( double fraction, int exponent ); double modf ( double value, double *ipart );16.2.5 幂
原型:
double pow ( double x, double y ); //计算xdey次方 double sqrt( double x ); //平方根16.2.6 底数,顶数,绝对值和余数
函数原型:
double floor( double x ); //返回不大于其参数的最大整数 double ceil ( double x ); //返回不小于其参数的最小整数 double fabs ( double x ); //绝对值 double fmod ( double x, double y ); //返回x处于y的余数16.3 日期和时间函数 16.3.1 处理器时间
原型:
clock_t clock ( void ); //返回这个 从程序开始执行起 处理器所消耗的时间。 time_t time ( time_t *returned_value ); //返回当前的日期和时间 char *ctime ( time_t const *time_value ); //ctime返回一个指向字符串的指针,格式化时间输出 double difftime( time_t time1, time_t time2 ); //计算time1-time2的时间差,并以秒为单位。 struct tm *gmtime( time_t const *time_value ); struct tm *localtime( time_t const *time_value ); char *asctime( struct tm const *tm_ptr ); //格式化输出时间值 ctime一致 size_t strftime( char *string, size_t maxsize, char const *format ); //格式转换 time_t mktime( struct tm *tm_ptr ); //把一个tm结构转换为time_t值
gmtime函数 把时间值转换为世界协调时间(coordinated universal time, UTC),也称为格林尼治时间(greenwich mean time)。
localtime函数 把时间值转换为当地时间。
16.4非本地跳转setjmp 和 longjmp 函数 提供了一种类似goto语句的机制,但是并不局限在一个函数作用域中,常用于深层嵌套函数的调用链。
函数原型为:
int setjmp( jmp_buf state ); void longjmp( jmp_buf state, int value );16.5 信号
补充:程序中所发生的事件绝大多数都是程序本身多引发的,例如执行各种语句和请求输入。但是,有些程序程序必须遇到事件而不是程序本身。信号(signal)表示一种事件,他可能异步发生,也就是并不与程序执行过程的任何事件同步。
16.5.1 信号名标准定义的信号:
| 信号 | 含义 |
|---|---|
| SIGABRT | 程序请求异常终止,一个abort函数引发的信号 |
| SIGFPE | 发生一个算术错误,例如溢出 |
| SIGILL | 检测到非法指令,提示CPU正在执行一个非法指令 |
| SIGSEGV | 检测到对内存的非法访问。例如:违反了边界要求 |
| SIGINT | 收到一个交互性注意信号–异步 |
| SIGTERM | 收到一个终止程序的请求–异步 |
通常我们只关心那些自主发生的信号,也就是无法预测什么时候发生的信号。
raise函数 用于显示引发一个信号 :int raise( int sig ); 调用这个函数将引发它的参数所指定的信号。
当一个信号发生时,程序可以使用3种方式对它做出反应:1、缺省的反应由编译器决定,通常是终止程序。2、忽略。3、设置一个信号处理函数。
signal函数 用于指定程序遇到信号时希望的反应。原型如下:
void ( *signal( int sig, void( *handler )( int ) ) ) ( int );16.6 打印可变参数列表
下面函数用于必须打印可变参数列表的场合。原型如下:
int vprintf( char const *format, va_list arg ); int vfprintf( FILE *stream, char const *format, va_list arg ); int vsprintf( char *buffer, char const *format, va_list arg );16.7 执行环境 16.7.1 终止执行
三个与程序终止有关的函数原型如下:
void abort( void ); //不正常呢地终止一个正在执行的程序,引发SIGABRT信号 void atexit( void(func)(void) ); // 把一些函数注册为退出函数,当程序正常结束,退出函数将被调用 void exit( int status ); //终止函数16.7.2 断言
断言就是声明某种东西应该为真,如果置为假,就向标准错误打印一行诊断信息,并终止程序。宏的“原型”如下:
void assert( int expression );
16.7.3 排序和查找qsort函数 在一个数组中以升序的形式对数据进行排序,他和类型无关,但数组长度必须固定。原型为:
void qsort( void *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *) );
第一个参数为待排序的数组,第二个为数组元素个数,第三个为每个元素长度,第四个参数为函数指针,指向用于进行元素比较大小的函数。
bsearch函数 在一个已经排序好的数组用二分查找一个元素,如果数组为排序,结果未定义。原型:
void *bsearch( void const *key, void const *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const* ) );



