笔记涵盖C语言标准库的15个头文件解释以及相应函数,持续更新。
1.assert.h 断言
assert.h 提供了宏assert的定义,如果断言不为真,则程序会在标准错误流输出提示信息,并使程序异常中止,调用abort()。
demo:
#include <assert.h> #include <stdio.h> int main() { int a = 12; int b = 24; assert(a > b); printf("a is smaller than b!\n"); return 0; }
output:
test-c-function.out: test-c-function.cpp:8: int main(): Assertion ‘a > b' failed. 已放弃 (核心已转储)
上面的程序中止,printf函数并未执行,且有这样的输出,int main(): Assertion ’a > b' failed.,原因就是因为a其实小于b,导致断言失败,assert输出错误信息,并调用abort()中止了程序的运行。
将 assert(a > b); 修改为assert(a <= b);
output:
a is smaller than b!
正常输出了printf的内容。
2.ctype.h 字符测试
ctype.h 主要提供两类函数:字符测试函数和字符大小转换函数,提供的函数中都是以int类型为参数,并返回一个int类型的值,实参类型应该隐式转换或者显式转换为int类型。
1.islanum
定义:int isalnum(int c),判断是否是字母或者数字。
2.isalpha
定义:int isalpha(int c),判断是否是字母。
3.iscntrl
定义:int iscntrl(int c),判断是否是控制字符。
4.isdigit
定义:int isdigit(int c),判断是否是数字。
5.isgraph
定义:int isgraph(int c),判断是否是可显示字符。
6.islower
定义:int islower(int c),判断是否是小写字母。
7.isupper
定义:int isupper(int c),判断是否是大写字母。
8.isprint
定义:int isprint(int c),判断是否是可显示字符。
9.ispunct
定义:int ispunct(int c),判断是否是标点字符。
10.issapce
定义:int isspace(int c),判断是否是空白字符。
11.isxdigit
定义:int isxdigit(int c),判断字符是否是16进制。
12.tolower
定义:int tolower(int c),转换为小写字母。
13.toupper
定义:int toupper(int c),转换为大小字母。
3.errno.h 错误代码
errno.h 定义了通过错误码来返回错误信息的宏,errno 宏定义为一个int形态的左值,包含任何函数使用errno功能所产生的上一个错误码。
一些表示错误码,定义为整数值的宏:
EDOM,源自于函数的参数超出范围;
ERANGE,源自于函数的结果超出范围;
EILSEQ,源自于不合法的字符顺序;
4.float.h 浮点数运算
float.h 定义了浮点数值的最大最小限,浮点型数值以下面的方式定义:符号-value E 指数 符号是正负,value是数字的值。
下面的值是用#define定义,所有实例里FLT指的是float,DBL是double,LDBL指的是long double。
FLT_ROUNDS:定义浮点型数值四舍五入的方式,-1是不确定,0是向0,1是向最近,2是向正无穷大,3是负无穷大。
FLT_RADIX 2:定义指数的基本表示(比如base-2是二进制,base-10是十进制,base-16是十六进制)。
FLT_MANT_DIG,DBL_MANT_DIG,LDBL_MANT_DIG:定义数值里数字的个数。
FLT_DIG 6,DBL_DIG 10,LDBL_DIG 10:再四舍五入之后能不更改表示的最大小数位。
FLT_MIN_EXP,DBL_MIN_EXP,LDBL_MIN_EXP:FLT_RADIX的指数的最小负整数值。
FLT_MIN_10_EXP -37,DBL_MIN_10_EXP -37,LDBL_MIN_10_EXP -37:10进制表示法的指数的最小负整数值。
FLT_MAX_EXP,DBL_MAX_EXP,LDBL_MAX_EXP:FLT_RADIX的指数的最大整数值。
FLT_MAX_10_EXP +37,DBL_MAX_10_EXP +37,LDBL_MAX_10_EXP +37:10进制表示法的指数的最大整数值。
FLT_MAX 1E+37,DBL_MAX 1E+37,LDBL_MAX 1E+37:浮点型的最大限。
FLT_EPSILON 1E-5,DBL_EPSILON 1E-9,LDBL_EPSILON 1E-9:能表示的最小有符号数。
5.limits.h 取值范围
CHAR_BIT:一个ASCII字符长度。
SCHAR_MIN:字符型最小值。
SCHAR_MAX:字符型最大值。
UCHAR_MAX:无符号字符型最大值。
CHAR_MIN,CHAR_MAX:char字符的最小最大值,如果char字符表示有符号整数,那么它们的值就和有符号整数一样,否则char字符的最小值就是0,最大值就是无符号char字符的最大值。
MB_LEN_MAX:一个祖父所占最大字节数。
SHRT_MIN:最小短整型。
SHRT_MAX:最大短整型。
USHRT_MAX:最大无符号短整型。
INT_MIN:最小整型。
INT_MAX:最大整型。
UINT_MIN:最大无符号整型。
LONG_MIN:最小长整型。
LONG_MAX:最大长整型。
ULONG_MAX:无符号长整型。
6.locale.h 本地化
locale.h 定义了区域设置相关的函数。
setlocale函数:用于设置或返回当前的区域特性。
定义:setlocale(constant,location)
constant:指定设置的场景信息。
location:指定需要进行场景设置的国家或区域。
localeconv函数:用于返回当前区域中的数字和货币信息(保存在struct lconv结构实例中)。
定义:struct lconv * localeconv(void)
7.math.h 数学函数
math.h 是C语言中的数学函数库。
三角函数:
double sin(double x):正弦;
double cos(double x):余弦;
double tan(double x):正切;
反三角函数:
double asin(double x):反正弦,结果介于[-PI/2,PI/2];
double acos(double x):反余弦,结果介于[0,PI];
double atan(double x):反正切(主值),结果介于[-PI/2,PI/2];
double atan2(double y,double):反正切(整圆值),结果介于[-PI,PI];
双曲三角函数:
double sinh(double x):计算双曲正弦;
double cosh(double x):计算双曲余弦;
double tanh(double x):计算双曲正切;
指数和对数:
double exp(double x):求取自然数e的幂;
double sqrt(double x):开平方;
double log(double x):以e为底的对数;
double log10(double x):以10为底的对数;
double pow(double x,double y):计算以x为底的y次幂;
float powf(float x,float y):与pow一致,输入与输出皆为浮点数;
取整:
double ceil(double x):向上取整;
double floor(double x):向下取整;
标准化浮点数:
double frexq(double f,int *p):标准化浮点数,f = x * 2^p,已知f求x,p(x介于[0.5,1]);
double ldexp(double x,int p):与frexp相反,已知x,p求f;
取整与取余:
double modf(double x,double *y):将参数的整数部分通过指针回传,返回小数部分;
double fmod(double x,double y):返回两个参数相除的余数;
8.setjmp.h 非局部跳转
setjmp.h中定义了一种特别的函数调用和函数返回顺序的方式,允许程序流程立即从一个深层嵌套的函数中返回。
int setjmp(jmp_buf env):设置跳转点,将当前程序的状态保存在结构env,为调用宏longjmp设置一个跳转点。
longjmp(jmp_buf env,int retval):跳转,利用setjmp设置的env变量进行跳转,程序会自动跳转到setjmp宏的返回语句处,返回值为retval。
一般,宏setjmp和longjmp是成对使用,这样程序流程可以从一个深层嵌套的函数中返回。
9.signal.h 信号
signal.h 头文件中,提供了一些函数用以处理执行过程中所产生的信号。
typedef sig_atomic_t
sig_atomic_t:类型是int类型,用于接受signal函数的返回值;
宏:
以SIG_开头的宏用于定义信号处理函数,
SIG_DFL:默认信号处理函数;
SIG_ERR:表示一个错误信号,当signal函数调用失败时的返回值;
SIG_IGN:信号处理函数,表示忽略该信号;
SIG开头的宏是用来在下列情况下,用于表示一个信号代码,
SIGABRT:异常中止(abort函数产生);
SIGFPE:浮点错误(0作为除数产生的错误,非法的操作);
SIGILL:非法错误(指令);
SIGINT:交互式操作产生的信号(如CRTL+C);
SIGSEGV:无效访问存储(片段的非法访问,内存非法访问);
SIGTERM:终止请求;
函数:
void (*signal(int sig,void (*func)(int))) (int):sig表示一个信号代码,即上面所定义的SIG开头的宏,当有信号出现的时候,参数func所定义的函数就会被调用。
如果func等于SIG_DFL,则表示调用默认的处理函数;
如果等于SIG_IGN,则表示这个信号被忽略(不做处理);
如果func是用户自定义的函数,则会先调用默认的处理函数,然后再调用用户自定义的函数。自定义函数,有意额参数,参数类型为int,用来表示信号代码,同时,函数必须以return,abort,exit或longjmp等语句结束。当自定义函数运行结束,程序会继续从被终止的地方继续运行。(除非信号是SIGFPE导致结果未定义,则可能无法继续运行)
如果调用signal函数成功,则会返回一个指针,该指针指向为所指定的信号类别的所预先定义的信号处理器。
如果调用失败,则返回一个SIG_ERR,同时errno的值也会被相应的改变。
int raise(int sig):发送一个sig,信号参数为SIG开头的宏。
如果调用成功,返回0,否则返回一个非零值。
10.stdarg.h 可变参数
stdarg.h 定义了一些宏,当函数参数未知时去获取函数的参数。
变量:
typedef va_list:通过stdarg宏定义来反问一个函数的参数表,参数列表的末尾会用省略号省略。
宏:
void va_start(va_list ap,last_arg):用va_arg和va_end宏初始化参数ap,last_arg是传给函数的固定参数的最后一个,省略号之前的那个参数,注意va_start必须在va_arg和va_end之前调用;
type va_arg(va_list ap,type):用type类型扩展到参数表的下个参数,注意,ap必须用va_start初始化,如果没有下一个参数,结果会是undefined;
void va_end(va_list ap):允许一个有参数表(使用va_start宏)的函数返回,如果返回之前没有调用va_end,结果会是undefined。参数变量列表可能不再使用(在没调用va_staart的情况下va_end);
11.stddef.h 一些常数,类型和变量
stddef.h 定义了一些标准定义,许多定义宴会出现在其他的头文件里。
宏:
NULL:空指针的常量值;
offsetof(type,member-designator):返回一个结构提成员相对于结构体起始地址的偏移量(以字节为单位),type是结构体的名字,member-designator是结构体成员的名字;
变量和定义:
typedef ptrdiff_t:两个指针相减的结果;
typedef size_t:是sizeof一个关键词得到的无符号整数值;
typedef wchar_t:一个宽字符常量的大小,是整数类型;
12.stdio.h 输入和输出
stdio.h 定义了用于输入和输出的函数、类型和宏。
变量:
typedef FILE:用于声明文件指针;
typedef size_t:是由sizeof产生的无符号整数类型;
typedef fpos_t:能够唯一说明文件中的每个位置的对象;
常量:
NULL:空值;
_IOFBF:表示完全缓冲;
_IOLBF:表示线缓冲;
_IONBF:表示无缓冲;
BUFSIZ:setbuf函数所使用的缓冲区的大小;
EOF:EOF是负整数,表示END OF FILE
FOPEN_MAX:同时打开的文件的最大数量;
FILENAME_MAX:文件名的最大长度;
L_tempnam:整数,最大长度的临时文件名;
SEEK_CUR:取得目前文件位置;
SEEK_END:将读写位置移到文件末尾;
SEEK_SET:将读写位置移到文件开头;
TMP_MAX:tmpnam最多次数;
stderr:标准错误流,默认为屏幕,可输出到文件;
stdin:标准输入流,默认为键盘;
stdout:标准输出流,默认为屏幕;
函数:
clearerr():复位错误标志;
fclose():关闭一个文件流;
feof():检测文件结束符;
ferror():检查流是否有错误;
fflush():更新缓冲区;
fgetpos():移动文件流的读写位置;
fopen():打开文件;
fread():从文件流读取数据;
freopen():打开文件;
fseek():移动文件流的读写位置;
fsetpos():定位流上的文件指针;
ftell():取得文件流的读取位置;
fwrite():将数据写至文件流;
remove():删除文件;
rename():更改文件名称或位置;
rewind():重设读取目录的位置为开头位置;
setbuf():把缓冲区与流相联;
setvbuf():把缓冲区与流相联;
tmpfile():以wb+形式创建一个临时二进制文件;
tmpnam():产生一个唯一的文件名;
fprintf():格式化输出数据至文件;
fscanf():格式化字符串输入;
printf():格式化输出数据;
scanf():格式化输入函数;
sprintf():格式化字符串复制;
sscanf():格式化字符串输入;
vfprintf():格式化输出数据至文件;
vprintf():格式化输出数据;
vsprintf():格式化字符串复制;
fgetc():由文件中读取一个字符;
fgets():文件中读取一字符串;
fputc():将一指定字符写入文件流中;
fputs():将一指定的字符串写入文件内;
getc():由文件中读取一个字符;
getchar():由标准输入设备内读进一个字符;
gets():由标准输入设备内读进一个字符串;
putc():将一指定字符写入文件中;
putchar():将指定的字符写道标准内输出设备;
puts():送一字符串到流stdout中;
ungetc():将指定字符写回文件流中;
perror():打印出错误原因信息字符串;
13.stdlib.h 实用功能
stdlib.h 包含了C语言中最常用的函数。
宏:
NULL:空
EXIT_FAILURE:失败状态码;
EXIT_SUCCESS:成功状态码;
RAND_MAX:rand的最大返回值;
MB_CUR_MAX:多字节字符中的最大字节数;
变量:
typedef size_t:是unsigned integer类型;
typedef wchar_t:一个宽字符的大小;
struct div_t:是结构体类型 作为div函数的返回类型;
struct ldiv_t:是结构体类型 作为ldiv函数的返回类型;
函数:
字符串函数:
atof:将字符转换成浮点数;
atoi:将字符转换成整数;
strtod:将字符串转换成浮点数;
strtol:将字符串转换成长整型数;
strtoul:将字符串转换成无符号长整型数;
内存控制函数:
calloc:配置内存空间;
free:释放原先配置的内存;
malloc:配置内存空间;
realloc:重新分配主存;
环境函数:
abort:异常终止一个进程;
atexit:设置程序正常结束前调用的函数;
exit:正常结束进程;
getenv:取得环境变量内容;
system:执行shell命令;
搜索和排序函数:
bsearch:二分搜索;
qsort:利用快速排序法排列数组;
数学函数:
abs:计算整数的绝对值;
div:将两个整数相处,返回商和余数;
labs:取长整型绝对值;
ldiv:两个长整型数相除,返回商和余数;
rand:随机数发生器;
srand:设置随机数种子;
多字节函数:
mblen:根据locale的设置,确定字符的字节数;
mbstowcs:把多字节字符串转换为宽字符串;
mbtowc:把多字节字符转换成为宽字符;
wcstombs:把宽字符串转换为多字节字符串;
wctomb:把宽字符转换为多字节字符;
14.string.h 字符串函数
string.h 包含了C语言最常用的字符串操作函数。
宏:
NULL
变量:
typedef size_t
函数:
memchr:在某一内存返回中查找一特定字符;
memcmp:比较内存内容;
memcpy:拷贝内存内容;
memmove:拷贝内存内容;
memset:将一段内存空间填入空值;
strcat:连接两字符串;
strncat:连接两字符串;
strchr:查找字符串中第一个出现的指定字符;
strcmp:比较字符串;
strncmp:比较两个字符串的前N个字符;
strcoll:采用目前区域的字符排列比较字符串;
strcpy:拷贝字符串;
strncpy:拷贝字符串;
strcspn:返回字符连续不含指定字符的字符数;
strerror:返回错误原因的描述字符串;
strlen:计算字符串长度;
strpbrk:查找字符串中第一个出现的指定字符;
strrchr:查找字符串中最后出现的指定字符;
strcspn:返回字符串连续不含指定字符的字符数;
strstr:在一字符串中查找指定的字符串;
strtok:分割字符串;
strxfrm:转换字符串;
15.time.h 时间和日期函数
time.h 是C语言标准函数库中获取时间和日期、对时间与日期数据操作及格式化的头文件。
宏:
NULL:null是一个null指针常量的值;
CLOCK_PER_SEC:每秒的时钟数;
变量:
typedef size_t:类型定义;
typedef clock_t:类型定义;
struct tm:结构体;
struct tm { int tm_sec;//秒,[0,59]; int tm_min;//分,[0,59]; int tm_hour;//时,[0,23]; int tm_mday;//一个月中的日期,[1,31]; int tm_mon;//月份,[0,11]; int tm_year;//年份,实际年份-1900; int tm_wday;//星期,[0,6]; int tm_yday;//从每年的1月1号开始的天数,取值[0,365]; int tm_isdst;//夏令时标识符,实行夏令时,为正;不实行时,为0;不了解情况时,为负; }
函数:
asctime:将时间和日期以字符串格式表示;
clock:确定处理器时间;
ctime:把日期和时间转换为字符串;
difftime:计算两个时刻之间的时间差;
gmtime:把日期和时间转换为(GMT)时间;
localtime:取得当地目前时间和日期;
mktime:将时间结构数据转换成经过的秒数;
strftime:将时间格式化;
time:取得目前的时间;