C和指针读书笔记(第十六章)

1. 整型函数
这组函数返回整型值。这个函数分为三类:算数,随机数和字符串转换。函数原型位于stdlib.h
1.1. 算数

int abs(int value);  //返回参数绝对值
long int labs(long int value);  //作用对象长整型
div_t div(int numerator, int denominator);  //第二个参数(分母)除以第一个参数(分子),返回div_t结构体
ldiv_t ldiv(long int numer, long int denom);  //作用于长整型

div_t结构体包含下面两个字段
int quot; //商
int rem; //余数
1.2. 随机数

int rand(void);  //返回一个在0和RAND_MAX(至少为32767)之间的伪随机数
//为了得到范围更小的伪随机数,可以对返回值对范围大小进行取模
void srand(unsigned int seed);

为了避免程序每次运行时获得相同的随机数序列,可调用srand函数。它用它的参数值对随机数发生器进行初始化。
1.3. 字符串转换
字符串转换函数把字符串转换为数值,其中最简单的函数atoi和atol执行基数为10的转换,strtol允许你在转换时指定基数,同时它们还允许你访问字符串的剩余位置。

int atoi(char const *string);  //把字符转换成整型
long int atol(char const *string);  //把字符转换成长整型
long int strtol(char const *string, char **unused, int base);  
unsigned long int strtoul(char const *string, char **unused, int base);

atol和strtol同样把参数字符转换成long。但是,strtol保存一个指向转换值后面第1个字符的指针。如果函数的第2个参数非NULL,这个指针便被保存在第2个参数所指向的位置。这个指针允许字符串的剩余部分进行处理而无须推测转换在字符串的哪个位置终止。
strtoul和strtol执行方式相同,产生一个无符号长整数。
函数的第3个参数是转换所执行的基数。如果基数为0,任何在程序中的整数字面值都被接受,包括指定数字基数的形式。否则基数值应该在2到36之间——转换一句基数进行。对于基数11-36(基数就是进制的意思),字母A到Z(小写字母一致)分别被解释为数值10-35。
例:

x = strtoul("   590bear", next, 12);

返回值为9947(5*12^3+9*12^2+0*12+b(11)=9947),并把一个指向字母e的指针保存在next所指向的变量中。转换在b处终止,因为基数为12时e不是一个合法的数字。
如果函数的string参数中并不包含一个合法的数值,函数就返回0,如果被转换的值无法表示,函数就在errno中存储ERANGE这个值,并返回一个值。
strtol和strtoul返回的错误值
strtol:值太大且为负数,返回LONG_MIN。如果值太大且为正数,返回LONG_MAX
strtoul:如果值太大,返回ULONG_MAX


2. 浮点型函数
头文件math.h包含了函数库中剩余的数学函数的声明。这些函数的返回值和参数绝大多数都是double类型
2.1. 三角函数

//参数是用弧度表示的角度,返回参数的正弦,余弦和正切值
double sin(double angle);  
double cos(double angle);
double tan(double angle);
//返回参数的反正弦,反余弦和反正切值
double asin(double angle);
double acos(double angle);
double atan(double angle);
//返回y/x的反正切值
double atan2(double x, double y);

2.2. 双曲函数

//返回参数的双曲正弦,双曲余弦和双曲正切值,参数是用弧度表示的角度
double sinh(double angle);
double cosh(double angle);
double tanh(double angle);  

2.3. 对数和指数函数

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

2.4. 浮点表示形式

double frexp(double value, int *exponent);  
double ldexp(double fraction, int exponent);
double modf(double value, int *ipart);

2.5.

double pow(double x, double y);  //返回x^y
double sqrt(double x);  //返回参数平方根

2.6. 底数、顶数、绝对值和余数

double floor(double x);  //返回不大于其参数的最大整数值
double ceil(double x);  //返回不小于其参数的最小整数值
double fabs(double x);  //返回参数绝对值
double fmod(double x, double y);  //返回x除以y的余数

2.7. 字符串转换
与整型字符串转换函数相似,返回浮点值。

double atof(char const *string);
double atrtod(cahr const *string, char **unused);

3. 日期和时间函数
函数原型位于time.h
3.1. 处理器时间

clock_t clock(void);

这个值可能是近似值。如果需要更精确的值,你可以在main函数刚开始执行时调用clock,然后把以后调用clock时返回的值减去前面这个值。如果机器无法提供处理器时间,或者如果时间值太大,无法用clock_t变量表示,函数就返回-1。
clock函数返回一个数字,转换为秒需要除以常量CLOCKS_PER_SEC
3.2. 当天时间

time_t time(time_t *returned_value);

如果参数是一个非NULL指针,时间值也将通过这个指针进行存储。无法提供时间或数值太大返回-1。

下面的函数用于操作time_t值

char *ctime(time_t const *time_value);
char difftime(time_t time1, time_t time2);

ctime函数的参数时一个指向time_t的指针,并返回指向字符串的指针。
字符串格式为:Sun Jul 4 04:02:48 1976\n\0
字符串内部空格固定。下一次调用ctime时字符串将被覆盖。
difftime函数计算time1-time2的值,并把结果转换为秒。返回double类型值。

下面的函数把一个time_t值转换为一个tm结构

struct tm *gmtime(time_t const *time_value);
struct tm *localtime(time_t const *time_t value);

gmtime把时间值转换为世界协调时间


4. 排序和查找stdlib.h
qsort函数在一个数组中以升序的方式对数据进行排序。与数组类型无关,但是数组元素长度要固定。

void qsort(void *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *));

第1个参数指向需要排序的数组,第2个参数指定数组中元素的数目,第3个参数指定每个元素的长度(以字符为单位)。第4个参数是一个函数指针,用于对需要排序的元素类型进行比较。排序时排序时,qsort调用这个函数对数组的数据进行比较。

bsearch函数在一个已经排好序的数组中用二分法查找一个特定的元素。

void bsearch(void const *key, void *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *));

第1个参数指定你需要查找的值,第2个参数指向查找所在的数组,第3个参数指定数组中元素的数目,第4个参数时每个元素的长度(字符为单位)。最后一个参数是和qsort中相同的指向比较函数的指针。bsearch函数返回一个指向查找到的数组的指针。查找值不存在返回NULL指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值