• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

chongs

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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>

字符串转换函数把字符串转换为数值:

  1. atoi,taol函数 用于执行基数为10的转换。
  2. 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>

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

  1. raise函数 用于显示引发一个信号 :int raise( int sig ); 调用这个函数将引发它的参数所指定的信号。
    当一个信号发生时,程序可以使用3种方式对它做出反应:
    • 缺省的反应由编译器决定,通常是终止程序。
    • 忽略。
    • 设置一个信号处理函数。
  2. 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>

  1. qsort函数 在一个数组中以升序的形式对数据进行排序,他和类型无关,但数组长度必须固定。原型为:
    void qsort( void *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *) );
    第一个参数为待排序的数组,第二个为数组元素个数,第三个为每个元素长度,第四个参数为函数指针,指向用于进行元素比较大小的函数。
  2. bsearch函数 在一个已经排序好的数组用二分查找一个元素,如果数组为排序,结果未定义。原型:
    void *bsearch( void const *key, void const *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const* ) );

posted on 2024-05-12 22:59  chongss  阅读(43)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3