C语言基础-标准函数库
1 整形函数
这组函数返回整型值。这些函数分为3类:算术,随机数,和字符串转换。
1.1 算术<stdlib.h>
标准函数库包含了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 随机数<stdlib.h>
下面两个函数可以产生伪随机数(pseudo-random number)。
int rand ( void ); //返回一个范围在 0~RAND_MAX(至少为32767)之间的伪随机数。它的随机序列是相同的.
void srand( unsigned int seed );//避免程序每次运行时获得相同的随机序列,可使用每天的时间作为随机数产生器的seed。
例子:srand( (unsigned int)time( 0 ) );
实例:
/*
使用随机数在牌桌上洗牌。第二个参数指定牌的的数量
*/
#include <stdlib.h>
#include <time.h>
#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;
}
}
1.3 字符串转换 <stdlib.h>
字符串转换函数把字符串转换为数值:
- 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不是一个合法的数字。
2 浮点型函数
头文件<math.h> 包含了函数库中剩余的数学函数声明。返回值大多都是double类型。
注意定义域错误(domain error) :一个函数的参数不在这个函数的定义域之内,如求一个负数的平方根 sqrt( -5.0 );
当一个定义域错误时,函数返回一个由编译器定义的错误值,并且在errno中存储这个EDOM。
范围错误(range error) :
一个函数的结果太大或者太小无法用double类型表示。
如:exp( DBL_MAX ); 这时函数会返回HUGE_VAL,它是一个在math.h中定义的double类型的变量。太小时返回0值。errno被置为ERANG.
2.1 三角函数 <math.h>
常见的三角函数原型:
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的反正切值
2.2 双曲函数 <math.h>
原型如下:
double sinh( double angle ); //返回双曲正弦值
double cosh( double angle );
double tanh( double angle );
2.3 对数和指数函数 <math.h>
原型如下:
double exp ( double x ); //返回e值得X次幂
double log ( double x ); //返回x以e为底的对数
double log10(double x ); //返回x以10为底的对数
2.4 浮点数表示形式 <math.h>
下面3个函数根据编译器定义的格式来存储浮点值:
double frexp( double value, int *exponent ); //在格式不兼容的机器之间有用。
double ldexp( double fraction, int exponent );
double modf ( double value, double *ipart );
2.5 幂 <math.h>
原型:
double pow ( double x, double y ); //计算xdey次方
double sqrt( double x ); //平方根
2.6 底数,顶数,绝对值和余数 <math.h>
函数原型:
double floor( double x ); //返回不大于其参数的最大整数
double ceil ( double x ); //返回不小于其参数的最小整数
double fabs ( double x ); //绝对值
double fmod ( double x, double y ); //返回x处于y的余数
3 日期和时间函数
3.1 处理器时间 <time.h>
原型:
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的时间差,并以秒为单位。
/*
下面两个函数把time_t类型的值转换为tm结构,tm结构允许我们很方便的访问日期和时间个各个组分。
*/
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函数 把时间值转换为当地时间。
4非本地跳转 <setjmp.h>
setjmp 和 longjmp 函数 提供了一种类似goto语句的机制,但是并不局限在一个函数作用域中,常用于深层嵌套函数的调用链。
函数原型为:
/*
声明一个jmp_buf的变量,setjmp对其初始化为0,并把调用setjmp函数的函数设置为顶层函数,在其他函数调用longjmp函数时返回到这个函数,此时setjmp返回值为longjmp的第二参数,这样就可以判断是否调用了Longjmp和调用了那个longjmp。
*/
int setjmp( jmp_buf state );
void longjmp( jmp_buf state, int value );
5 信号
补充:程序中所发生的事件绝大多数都是程序本身多引发的,例如执行各种语句和请求输入。
但是,有些程序程序必须遇到事件而不是程序本身。信号(signal)表示一种事件,他可能异步发生,也就是并不与程序执行过程的任何事件同步。
5.1 信号名 <signal.h>
标准定义的信号:
| 信号 | 含义 |
|---|---|
| SIGABRT | 程序请求异常终止,一个abort函数引发的信号 |
| SIGFPE | 发生一个算术错误,例如溢出 |
| SIGILL | 检测到非法指令,提示CPU正在执行一个非法指令 |
| SIGSEGV | 检测到对内存的非法访问。例如:违反了边界要求 |
| SIGINT | 收到一个交互性注意信号--异步 |
| SIGTERM | 收到一个终止程序的请求--异步 |
5.2 处理信号 <signal.h>
通常我们只关心那些自主发生的信号,也就是无法预测什么时候发生的信号。
- raise函数 用于显示引发一个信号 :
int raise( int sig );调用这个函数将引发它的参数所指定的信号。
当一个信号发生时,程序可以使用3种方式对它做出反应:- 缺省的反应由编译器决定,通常是终止程序。
- 忽略。
- 设置一个信号处理函数。
- signal函数 用于指定程序遇到信号时希望的反应。原型如下:
void ( *signal( int sig, void( *handler )( int ) ) ) ( int );
6 打印可变参数列表 <stdarg.h>&<stdio.h>
下面函数用于必须打印可变参数列表的场合。原型如下:
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 );
7 执行环境
7.1 终止执行 <stdlib.h>
三个与程序终止有关的函数原型如下:
void abort( void ); //不正常呢地终止一个正在执行的程序,引发SIGABRT信号
void atexit( void(func)(void) ); // 把一些函数注册为退出函数,当程序正常结束,退出函数将被调用
void exit( int status ); //终止函数
7.2 断言 <assert.h>
断言就是声明某种东西应该为真,如果置为假,就向标准错误打印一行诊断信息,并终止程序。宏的“原型”如下:
void assert( int expression );
7.3 排序和查找 <stdlib.h>
- 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* ) );
浙公网安备 33010602011771号