C 语言标准库函数

笔记涵盖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:取得目前的时间;