"C语言标准-函数库"

  "C语言基础复习十"

Posted by Xu on January 27, 2018

标准函数库

std_lib_func

整型函数:这组函数返回整型值,分为三类:算术,随机数和字符串转换

int_math

算术

int abs(int value);//返回参数的绝对值

long int labs(long int value);//也是返回参数的绝对值,但参数类型为长整型

div_t div(int numerator,int denominator);//第二个参数(分母)除以第一个参数(分子)产生商和余数,用一个div_t结构表示,该结构包含(int quot;//商    int rem;//余数 )

ldiv_t ldiv(long int numer,long int denom);//同上,参数为长整型。

随机数

int rand(void);//返回一个0到RAND_MAX(至少为32767)之间的伪随机数,如果为了获得某个范围内的随机数,我们可以用该函数的返回值对所需范围大小取模,然后加或减去一个偏移量来进行调整

void srand(unsigned int seed);//为了避免程序每次运行产生相同的随机数序列,可以用该函数,设置每天的时间作为随机数的种子,来产生随机数

srand((unsigned int time(0)));

字符串转换

忽略字符串的前导空白符,和无效后缀符

int atoi(char const *string);//将字符串转换成整数

long int atol(char const *string);//将字符串转换成长整数

long int strtol (char const *string, char **unused,int base);//将字符串转换为长整型,并将下一个字符的指针保存在unused中,base为基数,相当于base进制(0-36之间代表0-9及a-z一共36个字符,其中0代表接受所有整数字面值,只有基数限制返回内的字符才会被转换)。返回的值是被转换的字符串使用base进制计算后得到的十进制数

unsigned long int strtoul (char const *string,char **unused,int base);//同上

浮点型函数

float_math

头文件math.h包含了函数库中剩余的数学函数声明,这些函数的返回值和绝大部分的参数都是double类型

三角函数、双曲函数

double sin(double 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);

double sinh(double angle);
double cosh(double angle);
double tanh(double angle);

对数和指数函数

double exp(double x);//返回e的x次幂
double log(double x);//返回以e为底的x的对数
double log10(double x);//返回以10为底的x的对数

浮点表现形式

double frexp (double value,int *exponent);//将一个浮点数value分解成fraction*2^exponent的形式,指数存放在exponent,fraction作为返回值
double ldexp (double fraction,int exponent);//根据指数exponent和小数fraction计算该浮点值
double modf (double value,double *ipart);//将浮点数分为整数和小数,整数存放在ipart中,小数作为返回值

double pow(double x,double y);//计算并返回x^y的值
double sqrt(double x);//计算x的平方根

底数、顶数、绝对值、余数

double floor(double x);//地板、返回不大于x的最大整数值
double ceil(double x);//天花板、返回不小于x的最小整数值
double fabs(double x);//返回x的绝对值
double fmod(double x,double y);//返回x除以y产生的余数

字符串转换

忽略字符串的前导空白符,和无效后缀符

double atof(char const *string);//string为一个浮点数的书写字面字符串,然后将其转换成十进制double浮点数
double strtod(char const *string,char **unused);//同上,但会存放转换字符串后面第一个字符的指针

日期和时间函数

time

time.h头文件用于简化日期和时间的处理

处理器时间

clock_t clock(void);//返回从程序开始执行其处理器所消耗的时间,返回的值通常是一个数字,代表的是处理器时钟滴答的次数,为了把这个数转换为秒,应该除以常量CLOCK_PER_SEC

当天时间

time_t time(time_t *returned_value );//返回当前的日期和时间
char *ctime(time_t const *time_value);//将time_t格式的时间转换成表示时间一定格式的字符串
double difftime(time_t time1,time_t time2);//计算两个time_t变量之间的时间差值,并把结果转换为秒

struct tm *gmtime(time_t const *time_value);//将时间值转换为格林乔治标准时间(UTC,gmtime)结构体tm,可以方便访问时间的各个组成部分
struct tm *localtime(time_t const *time_value);//将时间转换为当地时间

当拥有结构体tm后,我们可以很方便的获取时间的各个组成部分,所以很容易对tm进行操作:

char *asctime(struct tm const *tm_ptr);//根据结构体tm信息,转换成Sun Jul 4 04:02:48 1976\n\0格式的时间字符串

size_t strftime(char *string,size_t maxsize,char const *format,struct tm const *tm_ptr);//根据结构体tm的信息,及格式format转换成格式化的表示时间的字符串,该字符串最大为maxsize,当转换的结果字符串小于maxsize,则会存放到string中。

time_t mktime(struct tm *tm_ptr);//将一个tm结构体转换成time_t值

非本地跳转

setjmp和longjmp函数提供一种类似goto语句机制,这些函数用于深层嵌套的函数调用链,当底层检测到错误时,可直接跳转到顶层函数,而不必向中间函数返回错误。

jmp

头文件: setjmp.h

int setjmp(jmp_buf state);//将"顶层"函数状态保存到jmp_buf(此后longjmp根据该jmp_buf中的状态进行返回),第一次调用返回零值作为入口,根据longjmp再次调用返回则是作为出口,返回longjmp的第二参数标签值

void longjmp(jump_buf state,int value);//调用该函数,会直接从setjmp处再次返回value,value相当于longjmp的标签,让出口setjmp知道是从哪个longjmp返回的

使用setjmp和longjmp省去了中间函数的错误代码逻辑,从而对它们进行简化

一种使用非本地跳转的模型:对不同类型的错误进行分类处理

value = setjmp(buf);//设置跳转回复状态点
switch(value){
  default:
  /*致命错误,中断程序*/
  break;
  case 1:
  /*小错误,忽略后继续执行*/
  process();
  break;
  case 0:
  /*第一次调用setjmp,正常事务处理*/
  process();//处理过程出现错误调用longjmp
  break;
}

信号

信号表示一个事件,当信号出现时,程序可能作出一个缺省反应,或者设置一个信号处理函数

信号名

信号 含义
SIGABRT 程序请求异常终止,同步
SIGFPE 发生一个算术错误,同步
SIGILL 检测到非法指令,同步
SIGSEGV 检测到对内存的非法访问,同步
SIGINT 收到一个交互性注意信号,异步,程序外部生成
SIGTERM 收到一个终止程序请求,异步,程序外部生成

信号处理

自主引发信号:

int raise(int sig);//发起由sig指定的信号

但发起一个信号时,程序设置该信号的处理函数:

void (*signal(int sig,void(*handler)(int)))(int);//该函数原型的含义为:signal为一个函数,该函数返回一个指针,该指针指向一个参数为int没有返回值的函数,signal函数的参数为一个sig,和一个信号处理函数指针,信号处理函数名为handler,参数为int,没有返回值

//不考虑参数的原型
void (*signal())(int);
  • 返回一个函数指针,指向该信号之前的处理函数,设置失败时,返回SIG_ERR
  • SIG_DFL(缺省反应)和SIG_IGN(忽略)可以作为signal函数的第二个指针

当一个已经设置了信号处理函数的信号发生时,系统熟悉恢复该信号的缺省行为,然后调用信号处理函数。所以信号的处理函数是一次性的。

信号处理函数可能执行的工作类型有限,如果信号是异步的,处理函数只能调用signal函数。并且所有的信号处理函数除了能向一个类型为volidate sig_atomic_t的静态变量赋值以外,无法访问其他任何静态数据。然后程序的剩余部分必须定期检查该变量的值,查看是否有信号发生。

volidate数据:volidate声明变量可能会因为信号的产生而发生变化,告诉编译器该变量不能进行常规优化。

从一个信号处理函数返回导致程序的执行流从信号发生的地点恢复执行

打印可变参数列表

stdio.h stdarg.h

将可变参数列表利用format进行格式化,输出到标准输出流,流,缓冲区buffer中去

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);

执行环境

终止执行

void abort(void);//abort()用于不正常地终止一个正在执行的程序
void atexit(void(func)(void));//可以把一些函数注册为退出函数,但程序正常终止时,退出函数将被调用
void exit(int status);//正常终止一个程序

断言

声明某种东西为真:

void assert(int expression);//当表达式为假(0)时,终止程序,打印诊断信息,为真时继续执行程序

当我们调试完毕后,丢弃所有断言,我们可以在assert.h头文件中增加定义:

#define NDEBUG

环境

环境是一个由编译器定义的名字/值对的列表,由操作系统维护

char *getenv(char const *name);//在列表中查找name名字所对应的值,找到返回该值的指针,否则返回NULL指针

执行系统命令

void system(char const *command);//将命令调用字符串传递给操作系统,成功执行返回非零值,否则返回零值

排序和查找

/*@param
*@ base:指向要排序的数组
*@ n_elements:数组中元素个数
*@ el_size:每个元素的长度,以字符为单位
*@ compare :一个用于对需要排序的元素进行比较的函数指针,qsort会调用这个函数来进行比较
*/
void qsort(void *base,size_t n_elements,size_t el_size,int (*compare)(void const *,void const *));//qsort函数的排序与类型无关,因为具体的比较过程由参数中compare指针确定

查找

void *bsearch(void const *key,void const *base, size_t n_elements,int (*compare)(void const *,void const *));//该函数用于在已经排好序的数组中利用二分法进行数据查找,后四个参数同qsort,只是第一个参数为想要查找的值,如果该值存在返回指向该值的指针,否则返回NULL指针