栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言进阶16-标准函数库

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言进阶16-标准函数库

16.1 整形函数

这组函数返回整型值。这些函数分为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 ) );

实例:

#include 
#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;
    }
}
16.1.3 字符串转换

字符串转换函数把字符串转换为数值。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 浮点型函数

**头文件**包含了函数库中剩余的数学函数声明。返回值大多都是double类型。

注意定义域错误(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收到一个终止程序的请求–异步
16.5.2 处理信号

通常我们只关心那些自主发生的信号,也就是无法预测什么时候发生的信号。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743637.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号