1 接口说明
1.1 assert.h
1.1.1 宏
assert()是一个诊断宏,用于动态辨识程序的逻辑错误条件。其原型是: void assert(int expression);
如果宏的参数求值结果为非零值,则不做任何操作(no action);如果是零值,用宽字符打印诊断消息,然后调用abort()。诊断消息包括:
- 源文件名字(在stdlib.h中声明的宏__FILE__的值)
- 所在的源文件的行号(在stdlib.h中声明的宏__LINE__的值)
- 所在的函数名(在stdlib.h中声明的宏__func__的值)
- 求值结果为0的表达式
诊断信息的显示目标依赖于被调用程序的类型。如果是控制台程序,诊断信息显示在stderr设备;如果是基于窗口的程序,assert()产生一个Windows MessageBox来显示诊断信息。
程序可以屏蔽掉所有的assert()而无需修改源代码。这只需要在命令行调用C语言的编译器时添加宏定义的命令行选项,定义NDEBUG宏;也可以在源程序程序引入<assert.h>之前就使用#define NDEBUG来定义宏。被屏蔽的assert()甚至不对传递给它的参数表达式求值,因此使用assert()时其参数表达式不能有副作用(side-effects)。
1.2 complex.h
1.2.1 类型
- double _Complex
- float _Complex
- long double _Complex
次序不是必须遵守的,比如float
_Complex也可以写成_Complex float。_Complex_I扩展为类型为const float _Complex的常量值,其值为虚数单位。 C99规定complex作为宏扩展为_Complex。但C++未定义complex宏。 gcc仅支持complex type,不支持imaginary type。因此宏I扩展为_Complex_I。 定义复数变量时,可以如此:
double _Complex v1=3.1+5*I;
double _Complex v2=3.2+5*_Complex_I;
float _Complex v3=4.6f+12.0IF; //必须先写i,后写f
_Complex float v4=8.2f+2.3if;
long double _Complex v5=1.23456789L+3.456789999iL; //必须先写i,后写L
也可以用CMPLX/CMPLXF/CMPLXL宏来表示相应复数表达式。
1.3 函数
- cacos 双精度版本
- cacosf 单精度版本
- cacosl 长双精度版本
- casin 双精度版本
- casinf 单精度版本
- casinl 长双精度版本
- catan 双精度版本
- catanf 单精度版本
- catanl 长双精度版本
- ccos 双精度版本
- ccosf 单精度版本
- ccosl 长双精度版本
- csin 双精度版本
- csinf 单精度版本
- csinl 长双精度版本
- ctan 双精度版本
- ctanf 单精度版本
- ctanl 长双精度版本
反双曲余弦
- cacosh 双精度版本
- cacoshf 单精度版本
- cacoshl 长双精度版本
反双曲正弦
- casinh 双精度版本
- casinhf 单精度版本
- casinhl 长双精度版本
反双曲正切
- catanh 双精度版本
- catanhf 单精度版本
- catanhl 长双精度版本
双曲余弦
- ccosh 双精度版本
- ccoshf 单精度版本
- ccoshl 长双精度版本
双曲正弦
- csinh 双精度版本
- csinhf 单精度版本
- csinhl 长双精度版本
双曲正切
- ctanh 双精度版本
- ctanhf 单精度版本
- ctanhl 长双精度版本
指数
- cexp 双精度版本
- cexpf 单精度版本
- cexpl 长双精度版本
- clog 双精度版本
- clogf 单精度版本
- clogl 长双精度版本
绝对值
- cabs 双精度版本
- cabsf 单精度版本
- cabsl 长双精度版本
幂运算
- cpow 双精度版本
- cpowf 单精度版本
- cpowl 长双精度版本
- csqrt 双精度版本
- csqrtf 单精度版本
- csqrtl 长双精度版本
操作
- carg 双精度版本
- cargf 单精度版本
- cargl 长双精度版本
- cimag 双精度版本
- cimagf 单精度版本
- cimagl 长双精度版本
- cong 双精度版本
- congf 单精度版本
- congl 长双精度版本
- cproj 双精度版本
- cprojf 单精度版本
- cprojl 长双精度版本
- creal 双精度版本
- crealf 单精度版本
- creall 长双精度版本
1.4 ctype.h
ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节字符,也支持宽字符。
1.4.1 函数
字节字符处理函数在ctype.h(C++的cctype )中声明。宽字节字符处理函数在wctype.h(C++的cwctype)中声明.
单字节 | 宽字节 | 描述 |
isalnum | iswalnum | 是否为字母数字 |
isalpha | iswalpha | 是否为字母 |
islower | iswlower | 是否为小写字母 |
isupper | iswupper | 是否为大写字母 |
isdigit | iswdigit | 是否为数字 |
isxdigit | iswxdigit | 是否为16进制数字 |
iscntrl | iswcntrl | 是否为控制字符 |
isgraph | iswgraph | 是否为图形字符(例如,空格、控制字符都不是) |
isspace | iswspace | 是否为空格字符(包括制表符、回车符、换行符等) |
isblank | iswblank | 是否为空白字符 (C99/C++11新增)(包括水平制表符) |
isprint | iswprint | 是否为可打印字符 |
ispunct | iswpunct | 是否为标点 |
tolower | towlower | 转换为小写 |
toupper | towupper | 转换为大写 |
不适用 | iswctype | 检查一个wchar_t是否是属于指定的分类 |
不适用 | towctrans | 使用指定的变换映射来转换一个wchar_t(实际上是大小写的转换) |
不适用 | wctype | 返回一个宽字符的类别,用于iswctype函数 |
不适用 | wctrans | 返回一个变换映射,用于 towctrans |
1.5 errno.h
errno宏定义为一个int类型的左值, 包含任何函数使用errno功能所产生的上一个错误码。
一些表示错误码,定义为整数值的宏:
- EDOM源自函数的参数超出范围,例如sqrt(-1)
- ERANGE源自函数的结果超出范围,例如strtol("0xfffffffff",NULL,0)
- EILSEQ源自不合法的字符顺序,例如wcstombs(str, L"\xffff", 2)
1.6 fenv.h
fenv.h是C标准函数库中的头文件,提供了对浮点环境的支持。浮点环境(floating-point environment)是指任何实现支持的浮点状态标志与控制模式。浮点状态标志(floating-point status flag)是一个系统变量,当浮点异常被抛出时该系统变量被置位。浮点控制模式(floating-point control mode)是一个系统变量,用户可以对其置位,以影响随后的浮点运算行为。
1.6.1 类型
fenv_t 表示整体浮点环境
fexcept_t 表示浮点状态的集合
1.6.2 宏
表示各种浮点运算异常:
- FE_DIVBYZERO
- FE_INEXACT
- FE_INVALID
- FE_OVERFLOW
- FE_UNDERFLOW
- FE_ALL_EXCEPT
近似舍入方法
- FE_DOWNWARD
- FE_TONEAREST
- FE_TOWARDZERO
- FE_UPWARD
缺省浮点环境
- FE_DFL_ENV
1.6.3 函数
feclearexcept 清除给定的浮点异常
fegetexceptflag 保存一个浮点状态标志到对象中
feraiseexcept 抛出一个浮点异常
fesetexceptflag 设置一个浮点状态标志到对象中
fetestexcept 测试那些浮点异常标志被置位
fegetround 获取当前近似舍入方法
fesetround 设置近似舍入方法
fegetenv 存储当前浮点环境到对象中
feholdexcept 存储当前浮点环境到对象中,清楚浮点状态标志,安装non-stop模式
fesetenv 从对象存储的浮点环境恢复现场
feupdateenv 保存当前浮点异常,从对象存储的浮点环境恢复现场,再重新抛出当前浮点异常
1.7 float.h
1.7.1 宏
双精度浮点类型
- DBL_DIG 十进制的精度位数:15
- DBL_EPSILON 保持运算的最小值:2.2204460492503131e-016
- DBL_MANT_DIG 尾数的位数:53
- DBL_MAX 最大值:1.7976931348623158e+308
- DBL_MAX_10_EXP 10进制最大指数值:308
- DBL_MAX_EXP 2进制最大指数值:1024 (即可以表示到21024这个数量级的值)
- DBL_MIN 最小的正值:2.2250738585072014e-308
- DBL_MIN_10_EXP10进制最小指数值: (-307)
- DBL_MIN_EXP 2进制最小指数值: (-1021)
- _DBL_RADIX 指数的进制基数: 2
- _DBL_ROUNDS 额外的舍入方法: 1
单精度浮点类型
- FLT_DIG 10进制的精度位数 6
- FLT_EPSILON 保持加法运算的最小值 1.192092896e-07F
- FLT_GUARD 0
- FLT_MANT_DIG 尾数的位数: 24
- FLT_MAX 最大值:3.402823466e+38F
- FLT_MAX_10_EXP 十进制的最大指数值: 38
- FLT_MAX_EXP 二进制的最大指数值: 128
- FLT_MIN 最小正值:1.175494351e-38F
- FLT_MIN_10_EXP 最小10进制指数值: (-37)
- FLT_MIN_EXP 最小二进制指数值: (-125)
- FLT_NORMALIZE 0
- FLT_RADIX 指数的进制基数: 2
- FLT_ROUNDS 额外的舍入方法: 1
长双精度浮点类型
均规定为双精度浮点类型的极限值:
- LDBL_DIG 即DBL_DIG
- LDBL_EPSILON 即DBL_EPSILON
- LDBL_MANT_DIG 即DBL_MANT_DIG
- LDBL_MAX 即DBL_MAX
- LDBL_MAX_10_EXP 即DBL_MAX_10_EXP
- LDBL_MAX_EXP 即DBL_MAX_EXP
- LDBL_MIN 即DBL_MIN
- LDBL_MIN_10_EXP 即DBL_MIN_10_EXP
- LDBL_MIN_EXP 即DBL_MIN_EXP
- _LDBL_RADIX 即DBL_RADIX
- _LDBL_ROUNDS 即DBL_ROUNDS
1.8 inttypes.h
1.8.1 宏
下述定义的宏用于stdint.h中定义的各种位宽的整形在格式化输入/输出时的格式标志。
前3个字符:
- PRI 用于printf format
- SCN 用于scanf format
第4个字符
- x 用于hexadecimal formatting
- u 用于unsigned formatting
- o 用于octal formatting
- i 用于integer formatting
- d 用于decimal formatting
其他字符
- 8 用于eight bit
- 16 用于sixteen bit
- 32 用于thirty-two bit
- 64 用于sixty-four bit
- FAST8 用于"fast" eight bit
- FAST16 用于"fast" sixteen bit
- FAST32 用于"fast" thirty-two bit
- FAST64 用于"fast" sixty-four bit
- LEAST8 用于"least" eight bit
- LEAST16 用于"least" sixteen bit
- LEAST32 用于"least" thirty-two bit
- LEAST64 用于"least" sixty-four bit
- PTR 用于指针
- MAX 用于maximum supported bit size
1.8.2 类型
imaxdiv_t 结构化类型,用于保存函数imaxdiv返回的除商与余数。
1.8.3 函数
imaxabs 计算绝对值
imaxdiv 计算商与余数
strtoimax 字符串转换为整数
strtoumax 字符串转换为无符号整数
wstrtoimax 宽字符串转换为整数
wstrtoumax 宽字符串转换为无符号整数
1.9 limits.h
1.9.1 宏
CHAR_BIT 字节的最小位数:8
SCHAR_MIN 有符号字符类型的最小值:-128
SCHAR_MAX 有符号字符类型的最大值:+127
UCHAR_MAX 无符号字符类型的最大值:255
CHAR_MIN 字符类型的最小值
CHAR_MAX 字符类型的最大值
MB_LEN_MAX 多字节字符在任何locale中可能的最长字节数:4/5/8/16
SHRT_MIN 短整型最小值:-32768,即- 215
SHRT_MAX 短整型最大值:+32767,即 215 - 1
USHRT_MAX 无符号短整型最大值:65535 ,即 216 - 1
INT_MIN 整型最小值:-2147483648,即 -(231)
INT_MAX 整型最大值:+2147483647 ,即231 - 1
UINT_MAX 无符号整型最大值:4294967295,即232 - 1
LONG_MIN 长整型最小值:-2147483648 ,即-(231 )
LONG_MAX 长整型最大值:+2147483647 ,即231 - 1
ULONG_MAX 无符号长整型最大值:4294967295 ,即232 - 1
LLONG_MIN 长长整型最小值:-9223372036854775808 ,即-(263 )
LLONG_MAX 长长整型最大值:+9223372036854775807 ,即263 - 1
ULLONG_MAX 无符号长长整型最大值:18446744073709551615 ,即264- 1
1.10 Locale.h
locale.h是C程序设计语言标准函数库的一个头文件,声明了C语言本地化函数。这些函数用于在处理多种自然语言的软件编程设计时,把程序调整到特定的区域设置. 这些区域设置影响到C语言标准库的输入/输出函数.
1.10.1 函数
Function | Description |
setlocale | 设置与读取当前C locale |
localeconv | 返回当前locale的货币与数值的格式细节 |
1.11 math.h
1.11.1 函数
函数原型 | 描述 |
double sin(double); | 正弦 |
double cos(double); | 余弦 |
double tan(double); | 正切 |
double asin(double); | 反正弦,结果介于 [ − π 2 , π 2 ] |
double acos(double) | 反余弦,结果介于 [ 0 , π ] |
double atan(double); | 反正切(主值),结果介于 [ − π 2 , π 2 ] |
double atan2(double, double); | 反正切(整圆值),结果介于 [ − π , π ] |
double sinh(double); | 双曲正弦 |
double cosh(double); | 双曲余弦 |
double tanh(double); | 双曲正切 |
double exp(double); | 指数函数 |
double sqrt(double); | 开平方根 |
double log(double); | 自然对数 |
double log10(double); | 常用对数 |
double pow(double, double); | 计算 x y |
float powf(float, float); | 功能等同于 pow(),只是输入参数与输出参数皆为单浮点数 |
double ceil(double); | 上取整 |
double floor(double); | 下取整 |
int abs(int); | 求整型的绝对值 |
double fabs(double); | 求绝对值 |
double cabs(struct complex); | 求复数的绝对值 |
double frexp(double f, int *p); | 标准化浮点数 |
double ldexp(double x, int p); | 与 frexp() 相反 |
double modf(double, double *); | 将参数的整数部分通过指针回传,返回小数部分 |
double fmod(double, double); | 返回两参数相除的余数 |
double hypot(double, double); | 已知直角三角形两个直角边长度,求斜边长度 |
double ldexp(double x, int exponent); | 计算 x ∗ 2 exponent |
double poly(double x, int degree, double coeffs [] ); | 计算多项式 |
int matherr(struct exception *); | 数学错误计算处理程序 |
1.12 setjmp.h
setjmp.h是C标准函数库中提供“非本地跳转”的头文件:控制流偏离了通常的子程序调用与返回序列。互补的两个函数setjmp与longjmp提供了这种功能。
setjmp/longjmp的典型用途是异常处理机制的实现:利用longjmp恢复程序或线程的状态,甚至可以跳过栈中多层的函数调用。
1.12.1 函数
1.13 signal.h
signal.h是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号。信号用作进程间通信,
报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。
1.13.1 信号
C语言标准定义了6个信号。都定义在signal.h头文件中[1]。
- SIGABRT - 异常中止。
- SIGFPE - 浮点异常。
- SIGILL - 无效指令。
- SIGINT - 交互的用户按键请求,默认情况下,这会导致进程终止。
- SIGSEGV - 无效内存访问。
- SIGTERM - 程序的中止请求。
signal.h可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号[2]。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。
1.13.2 函数
1.14 stdalign.h
- alignas 被扩展为_Alignas,_Alignas为C11的关键字。
- alignof 被扩展为_Alignof,_Alignof为C11的关键字。
- __alignas_is_defined 被扩展为1
- __alignof_is_defined 被扩展为1
在C++11中,alignas与alignof是关键字。alignas用于变量定义、数据成员声明、class\struct\union的声明与定义。alignas不可用于基本类型的别名、数组类型等。alignas只能用于更严格(更大对齐值)。alignas的参数可以为数、类型。
1.15 string.h
1.15.1 常量和类型
名称 | 说明 |
NULL | 表示空指针常量的宏,即表示一个不指向任何有效内存单元地址的指针常量。 |
size_t | 无符号整型,被用于sizeof运算符的返回值类型。 |
1.15.2 函数
名称 | 说明 |
void *memcpy(void *dest, const void *src, size_t n); | 将n字节长的内容从一个内存地址复制到另一个地址;如果两个地址存在重叠,则最终行为未定义 |
void *memmove(void *dest, const void *src, size_t n); | 将n字节长的内容从一个内存地址复制到另一个地址;与memcpy不同的是它可以正确作用于两个存在重叠的地址 |
void *memchr(const void *s, char c, size_t n); | 在从s开始的n个字节内查找c第一次出现的地址并返回,若未找到则返回NULL |
int memcmp(const void *s1, const void *s2, size_t n); | 对从两个内存地址开始的n个字符进行比较 |
void *memset(void *, int, size_t); | 用某种字节内容覆写一段内存空间 |
char *strcat(char *dest, const char *src); | 在字符串dest之后连接上src |
char *strncat(char *dest, const char *src, size_t n); | 从src截取n个字符连接在字符串dest之后,返回dest字符串 |
char *strchr(const char* str, int ch); | 从字符串str头开始查找字符ch首次出现的位置 |
char *strrchr(const char* str,int ch); | 从字符串str尾开始查找字符ch首次出现的位置 |
int strcmp(const char *, const char *); | 基于字典顺序比较两个字符串 |
int strncmp(const char *, const char *, size_t n); | 基于字典顺序比较两个字符串,最多比较n个字节 |
int strcoll(const char *, const char *); | 基于当前区域设置的字符顺序比较两个字符串 |
char *strcpy(char* str1, const char* str2); | 将str2拷贝给str1 |
char *strncpy(char* str1, const char* str2, size_t n); | 截取str2的n个字符拷贝给str1 |
char *strerror(int); | 返回错误码对应的解释字符串,参见errno.h(非线程安全函数) |
size_t strlen(const char *); | 返回一个字符串的长度 |
size_t strspn(const char *s, const char *strCharSet); | 从字符串s的起始处开始,寻找第一个不出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由strCharSet中的字符构成的子串的最大长度。strspn为string span的缩写。不支持多字节字符集。 |
size_t strcspn(const char *s, const char *strCharSet); | 从字符串s的起始处开始,寻找第一个出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由不属于strCharSet中的字符构成的子串的最大长度。strcspn为string complement span的缩写。不支持多字节字符集。 |
char *strpbrk(const char *s, const char *breakset); | 在字符串s中查找breakset中任意字符第一次出现的位置的指针值。strpbrk为string pointer break缩写。通常,breakset是分隔符的集合。不支持多字节字符集。 |
char *strstr(const char *haystack, const char *needle); | 在字符串haystack中查找字符串needle第一次出现的位置,heystack的长度必须长于needle |
char *strtok(char *strToken, const char *strDelimit ); | 将一个字符串strToken依据分界符(delimiter)分隔成一系列字符串。此函数非线程安全,且不可重入;但MSVC实现时使用了thread-local static variable因而是线程安全的但仍然是不可重入,即在单线程中不能对两个源字符串交替调用该函数来分析token,应当对一个字符串分析完成后再处理别的字符串。 |
size_t strxfrm(char *dest, const char *src, size_t n); | 根据当前locale转换一个字符串为strcmp使用的内部格式 |
名称 | 说明 |
void *memcpy(void *dest, const void *src, size_t n); | 将n字节长的内容从一个内存地址复制到另一个地址;如果两个地址存在重叠,则最终行为未定义 |
void *memmove(void *dest, const void *src, size_t n); | 将n字节长的内容从一个内存地址复制到另一个地址;与memcpy不同的是它可以正确作用于两个存在重叠的地址 |
void *memchr(const void *s, char c, size_t n); | 在从s开始的n个字节内查找c第一次出现的地址并返回,若未找到则返回NULL |
int memcmp(const void *s1, const void *s2, size_t n); | 对从两个内存地址开始的n个字符进行比较 |
void *memset(void *, int, size_t); | 用某种字节内容覆写一段内存空间 |
char *strcat(char *dest, const char *src); | 在字符串dest之后连接上src |
char *strncat(char *dest, const char *src, size_t n); | 从src截取n个字符连接在字符串dest之后,返回dest字符串 |
char *strchr(const char* str, int ch); | 从字符串str头开始查找字符ch首次出现的位置 |
char *strrchr(const char* str,int ch); | 从字符串str尾开始查找字符ch首次出现的位置 |
int strcmp(const char *, const char *); | 基于字典顺序比较两个字符串 |
int strncmp(const char *, const char *, size_t n); | 基于字典顺序比较两个字符串,最多比较n个字节 |
int strcoll(const char *, const char *); | 基于当前区域设置的字符顺序比较两个字符串 |
char *strcpy(char* str1, const char* str2); | 将str2拷贝给str1 |
char *strncpy(char* str1, const char* str2, size_t n); | 截取str2的n个字符拷贝给str1 |
char *strerror(int); | 返回错误码对应的解释字符串,参见errno.h(非线程安全函数) |
size_t strlen(const char *); | 返回一个字符串的长度 |
size_t strspn(const char *s, const char *strCharSet); | 从字符串s的起始处开始,寻找第一个不出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由strCharSet中的字符构成的子串的最大长度。strspn为string span的缩写。不支持多字节字符集。 |
size_t strcspn(const char *s, const char *strCharSet); | 从字符串s的起始处开始,寻找第一个出现在strCharSet中的字符,返回其位置索引值。换句话说,返回从字符串s的起始位置的完全由不属于strCharSet中的字符构成的子串的最大长度。strcspn为string complement span的缩写。不支持多字节字符集。 |
char *strpbrk(const char *s, const char *breakset); | 在字符串s中查找breakset中任意字符第一次出现的位置的指针值。strpbrk为string pointer break缩写。通常,breakset是分隔符的集合。不支持多字节字符集。 |
char *strstr(const char *haystack, const char *needle); | 在字符串haystack中查找字符串needle第一次出现的位置,heystack的长度必须长于needle |
char *strtok(char *strToken, const char *strDelimit ); | 将一个字符串strToken依据分界符(delimiter)分隔成一系列字符串。此函数非线程安全,且不可重入;但MSVC实现时使用了thread-local static variable因而是线程安全的但仍然是不可重入,即在单线程中不能对两个源字符串交替调用该函数来分析token,应当对一个字符串分析完成后再处理别的字符串。 |
size_t strxfrm(char *dest, const char *src, size_t n); | 根据当前locale转换一个字符串为strcmp使用的内部格式 |
1.16 tgmath.h
tgmath.h是C标准函数库中的头文件,提供了数学函数的类型通用的宏定义。使用这些宏调用数学函数时,会根据参数自动对应到类型适合的数学函数,其效果类似于C++的函数重载,使得编程者不必繁琐地去调用数学库函数的单精度、双精度、长双精度、单精度复数、双精度复数、长双精度复数等各个版本。
1.16.1 宏
1.16.2 math.h与complex.h共有
一些常见数学函数既在math.h有实数版本,也在complex.h有复数版本。tgmath.h提供了下述类型通用的宏定义:
acos、asin、atan、acosh、asinh、atanh、cos、sin、tan、cosh、sinh、tanh、exp、log、pow、sqrt、fabs
math.h专用
对于包含在math.h中,但在complex.h中没有对应的函数,提供了下述通用类型的宏:
atan2、cbrt、ceil、copysign、erf、erfc、exp2、expm1、fdim、floor、fma、fmax、fmin、fmod、frexp、hypot、ilogb、ldexp、lgamma、llrint、llround、log10、log1p、log2、logb、lrint、lround、nearbyint、nextafter、nexttoward、remainder、remquo、rint、round、scalbn、scalbln、tgamma、trunc
complex.h专用
对于包含在complex.h中,但在math.h中没有对应的函数,提供了下述通用类型的宏:
carg、cimag、conj、cproj、creal
1.17 time.h
1.17.1 数据类型
日历时间(Calendar Time),是从一个标准时间点(epoch)到现在的时间经过的秒数,不包括插入闰秒对时间的调整。开始计时的标准时间点,各种编译器一般使用UTC 1970-01-01 00:00:00。日历时间用数据类型time_t表示。[1]:20time_t类型实际上一般是32位整数类型,因此表示的时间不能晚于UTC 2038-01-18 19:14:07。为此,某些编译器引入了64位甚至更长的整型来保存日历时间,如Visual C++支持__time64_t数据类型,通过_time64()函数获取日历时间,可支持到UTC 3001-01-01 00:00:00的时间。
处理器时间(Processor Time),也被称为CPU时间(CPU Time),用以度量进程使用的CPU资源。处理器时间以时钟滴答数(Clock Tick)计算,通常从进程启动开始计时,因此这是相对时间。时钟滴答数用系统基本数据类型clock_t来表示,每秒钟包含CLOCKS_PER_SEC(time.h中定义的常量,一般为1000)个时钟滴答,也可使用sysconf函数得到每秒的时钟滴答数。clock_t类型一般是32位整数类型。[1]:20
分解时间(broken-down time),用结构数据类型tm表示,tm包含下列结构成员:
成员 | 描述 |
int tm_hour | 小时 (0 – 23) |
int tm_isdst | 夏令时启用 (> 0)、禁用 (= 0)、未知 (< 0) |
int tm_mday | 一月中的哪一天 (1 – 31) |
int tm_min | 分 (0 – 59) |
int tm_mon | 月 (0 – 11, 0 = 一月) |
int tm_sec | 秒 (0 – 60, 60 = 闰秒) |
int tm_wday | 一周中的哪一天 (0 – 6, 0 = 周日) |
int tm_yday | 一年中的哪一天 (0 – 365) |
int tm_year | 1900 以来的年数 |
1.17.2 函数
time_t time(time_t* timer)
得到从标准计时点(一般是UTC 1970年1月1日午夜)到当前时间的秒数。
clock_t clock(void)
得到从进程启动到此次函数调用的累计的时钟滴答数。
struct tm* gmtime(const time_t* timer)
从日历时间time_t到分解时间tm(世界协调时UTC)的转换。函数返回的是一个静态分配的tm结构存储空间,该存储空间被gmtime, localtime与ctime函数所共享. 这些函数的每一次调用会覆盖这块tm结构存储空间的内容。
struct tm* gmtime_r(const time_t* timer, struct
tm* result)
该函数是gmtime函数的线程安全版本.
struct tm* localtime(const time_t* timer)
从日历时间time_t到分解时间tm的转换,即结果数据已经调整到本地时区与夏令时。
time_t mktime(struct tm* ptm)
从基于本地时区(与夏令时)的分解时间tm到日历时间time_t的转换。忽略tm_wday与tm_yday的输入值。如果tm_isdst不确定则输入设为-1。其它各输入域的值可以任意设定,输出时被规范化到正确范围。例如,想要计算2012年的第200天的日期,设为1月200日,函数会输出正确的结果
time_t timegm(struct tm* brokentime)
从分解时间tm(被视作UTC时间,不考虑本地时区设置)到日历时间time_t的转换。该函数较少被使用。
char *asctime(const struct tm* tmptr)
把分解时间tm输出到字符串,结果的格式为"Www
Mmm dd hh:mm:ss yyyy",即“周几 月份数 日数 小时数:分钟数:秒钟数 年份数”。函数返回的字符串为静态分配,长度不大于26,与ctime函数共享。函数的每次调用将覆盖该字符串内容。
char* ctime(const time_t* timer)
把日历时间time_t timer输出到字符串,输出格式与asctime函数一样.
size_t strftime(char* s, size_t n, const char*
format, const struct tm* tptr)
把分解时间tm转换为自定义格式的字符串,类似于常见的字符串格式输出函数sprintf。例如:strftime(buf, 64, "%Y-%m-%d
%H:%M:%S", localtime);
char * strptime(const char* buf, const char*
format, struct tm* tptr)
strftime的逆操作,把字符串按照自定义的格式转换为分解时间tm。
double difftime(time_t timer2, time_t timer1)
比较两个日历时间之差。
1.18 ctype.h
ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节字符,也支持宽字符。
1.18.1 函数
单字节字符处理函数在ctype.h(C++的cctype )中声明。宽字节字符处理函数在wctype.h(C++的cwctype)中声明.
单字节 | 宽字节 | 描述 |
isalnum | iswalnum | 是否为字母数字 |
isalpha | iswalpha | 是否为字母 |
islower | iswlower | 是否为小写字母 |
isupper | iswupper | 是否为大写字母 |
isdigit | iswdigit | 是否为数字 |
isxdigit | iswxdigit | 是否为16进制数字 |
iscntrl | iswcntrl | 是否为控制字符 |
isgraph | iswgraph | 是否为图形字符(例如,空格、控制字符都不是) |
isspace | iswspace | 是否为空格字符(包括制表符、回车符、换行符等) |
isblank | iswblank | 是否为空白字符 (C99/C++11新增)(包括水平制表符) |
isprint | iswprint | 是否为可打印字符 |
ispunct | iswpunct | 是否为标点 |
tolower | towlower | 转换为小写 |
toupper | towupper | 转换为大写 |
不适用 | iswctype | 检查一个wchar_t是否是属于指定的分类 |
不适用 | towctrans | 使用指定的变换映射来转换一个wchar_t(实际上是大小写的转换) |
不适用 | wctype | 返回一个宽字符的类别,用于iswctype函数 |
不适用 | wctrans | 返回一个变换映射,用于 towctrans |
©统信软件技术有限公司。访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。除此以外,将本网站任何内容或服务进行转载,须备注:该文档出自【faq.uniontech.com】统信软件知识分享平台。否则统信软件将追究相关版权责任。