C程序设计常用库函数.docx.pdf
C+程序设计常用库函数 木文主要涉及两类库函数,运行期库(run-time library) 和 C+标准库。下而简单介绍这些库的使用要点。 运行期库是用C 语言实现的基础程序库,其它库都以此为基础。MSDN 将运行期库按功能划分,如表 B-1 所示。来自MSDN Library Visual Studio 6.0 Visual C+ Documcntation Using Visual C+ Visual C+ Programmers Guide Run-Time Library Reference Run-Time Routines by Category 表 B-1 运行期库 分类功能相关头文件 ( 不完全 ) 可变参数用于定义可变参数的函数 缓冲区管理按字节管理内存缓冲区 按字节分类多字节字符分类,与当前多字节代码页相关 按字符分类 对单字节字符、宽字符、多字节字符进行分 类。比较常用,如isalpha, isprinto 数据转换 一种数据转换到另一种,例如字符串到int 或 double,或反之。冇很多转换既冇函数实现, 也有宏实现,可选择。 调试程序 debug调试,函数库中有专门的调试版本, 支持单步执行、断言、错误检测、异常,跟踪 堆空间分配,避免内存港露,以及调试信息报 告等。 目录控制 读取或改变目录,创建、删除目录等,也包括 使用环境路径來搜索文件 错误处理 包括断言、检测10 错误、清除错误标记、判 断低级 10 的文件尾 eof等。 异常处理程序 程序终止处理 (terminate) 意外处理 (unexpected) h 文件处理 对磁盘文件的建立、删除、改名、文件访问许 可等操作。 浮点数支持专门针对浮点数的计算,如指数、对数、三角 函数、双曲函数等,也包括错误检测,如溢 出。 输入输岀 从文件或设备中读入数据或写出数据。文件10 要区分文本模式和二进制模式。10 分为 以下 三类: 1、流式工 0, 将数据作为字符或字节序列,有 缓冲。 2、低级 10, 直接调用操作系统,无缓冲。 3、控制台与端口10, 对键盘和字符显示器的 直接读写,对10 设备,如打印机、串行口的 直接读写。 国际化 适应不同语言,与地域locale相关程序、宽 字符、多字节字符、通用文本等等。 内存分配 动态分配、回收内存,如malloc free 等 函数。 进程控制与坏 境控制 进程的启动、停止与管理,也包括线程的启 停。操作系统坏境信息的读取与改变。 排序与查找 对任意类型数组进行排序,折半査找与线性查 找。 字符串管理 对以 NULL 结尾的各种字符串进行操作 时间管理获取当前系统日期时间、转换、调整等操作 注1MSDN按以上19类功能对运行期库分组。 注2同 一 个 函 数 可 能 出 现 在 不 同 功 能 分 组 中 , 也 可 能 出 现 在 不 同 的 头 文 件 中 。 注3 运 行 期 库 是 纯C 语 言 实 现 , 不 包 含C + + 的 内 容 ( 没 有 重 载 、 形 参 缺 省 值 、 引 用 、 模 板 等 ) 。 表 B-2 运行期库头文件 头文件名功能C+包装头文件名 断言设置 字符分类 由库函数执行,检测错课代码 浮点数计算 ISO 64 6字符集处理 检测整数类型的性质 不冋地域文字适应性 公共数学计算 执行非本地goto语句 控制各种异常条件 可变参数的函数 多种有用的类型 (typedef)和宏的定义 输入和输出 多种操作函数 多种字符串的处理 系统时间处理 宽字符流,以及待殊字符串处理 宽字符分类 注 1,表中列出的 18 个头文件是作为C+标准库,而运行期库的头文件还有许多未列入。注 2, C+标准库的头 文件大多不含 .h 后缀。 注 3,左边头文件内容被包装到C+标准的命名空间std中。例如, vcasscrt文件大致如下 : namespace std #include ; 表 B-3 标准 C+库头文件 头文件名功能 算法,提供了70 多个模板函数,通过迭代器作用于各种容器,实现排序、查找、集 合运算等算法。 复数,一个模板类和若干模板函数 双端队列容器, 1 个模板类和 3 个支持模板 定义异常基类exception,若 T 模板函数,类似 eh.h 中的定义 支持磁盘文件的iostream操作 提供模板类以构建函数对象,类似于函数指针,供各种容器和算法使用 定义带参格式控制符,用于控制输出格式 定义了basic ios类,作为 iostream的基类 定义了对几种模板类的正向引用, 供 iostream使用 对 ISO646字符集的处理 输入流,定义了模板类basic istream和 basic iostream 迭代器,用于访问容器中的元素,也用于调用各种算法。 定义了模板类numeric limits,其中规范了算术计算中各种类型的值范围 列表,基于双向链表的一种容器。 提供一组模板类和函数,封装和管理地域locale信息,以支持多国文字习惯用法。 映射容器,捉供了一个映射map 和一个多射 multimap。 一个类,一个运算符和若干函数用于请求分配与回收对象 提供若干模板函数,用于数值计算,如求和、求乘积、求部分和等。 队列容器,包含一个队列和一个优先级队列。 集合容器,包含一个集合set和一个多集 multiseto 支持对数组对象的iostream操作,支持与basic string的转换 堆栈容器, stack模板类 标准异常类型,以exception为基类,定义了一组派生类來描述各种异常类型。 定义了basic streambuf模板类,作为一组iostream类的基础 定义了basic_string模板类,一种容器,其中用typedef定义了string类 型。 支持对字符数组对象的iostream操作,支持与C 字符串的转换 ility定义了对偶 pair,作为映射和多射的基木元素 定义了vmlacay模板类,支持可变长的数组 向量容器, 1 个模板类和 3 个支持模板 注 1,表中列出了32 个头文件,加上前而18 个包装头文件,共50 个头文件,组成C+标准库。注 2,还有儿个 头文件未列入文档,hash_map x vhash_sct、ncw,它们没有被完整实现。 注 3,上表中包含了10个新版木的 10 流头文件,而老版木只冇8 个头文件,对应关系如卜?表。 表 B-4 10 流的新旧头文件对比 【口版本IO流头文件新版本IO流头文件 h 注 I,同一行上的两个头文件具有大致相同的功能,但内部具体类型有差别。 注 2,新老版本不能用在同一个项目中,因为它们使用不同的库文件(lib 文件和 dll 文件 ) 。 下面是一些常用的 运行期库。 表B-5数学函数 函数原型功能返回值说明 int abs(int x) long labs(long x) double fabs(double x) 求绝对值绝对值 double pow(double x, double y) 求 x 的 y 次方计算结果 double sqrt(double x) 求 x 的平方根计算结果 double fmod(double x, double y) 求 x 除以 y 的余数 余数 使 x=i*y+f, f是返回 值, i 是整数,且 f 与 X 相同符号 double ceil(double x) 大于等于 X 的最小整数ceil (2.8) =3 double floor(double x) 小于等于 x 的故大整数 女 II floor (2.8)=2 double modf(double x, double *y) 取 x 的整数部分送到y 所指向的单元中 X 的小数部分 将浮点数 X 分解为整数部 分和小数部分,如-2.3分 解为 -2 和-0.3 double exp(double x) e 的 x 次方 double log(double x) 白然对数 In (x),以 e 为底的对数 x0 double loglO(double x) 以 10 为底的对数x0 三角函数 double sin(double x) double sinh(double x) 正弦 sin (x) 双曲正弦 sinh (x) 计算结果X 为弧度值 double cos(double x) double cosh(double x) 余弦 cos (x) 双曲余弦 cosh (x) 计算结果 X 为弧度值 double tan(double x) 正切 tan (x) 计算结果X 为弧度值 double tanh (double x) 双曲正切 double asin (double x) 反 iE 弦 arcsin (x) -1 函数原型功能返回值说明 void srand(unsigned int seed) 设 置 伪 随 机 数 序 列 的 起 点,即随机数生成种子 先设置种子,再调用 rand生成随机数 int rand(void) 生成一个伪随机整数随机正整数, 0 void abort(void) 终止进程,而没冇刷新 缓冲区,也没冇执行消 理 不到万不得已,不要调用 void exit (int status) 先执行清理,刷新缓冲 区,关闭打开的文件, 最后终止进程 返回 0 表示正常,其它值 表示错误。返回值可被操 作系统的批处理命令获 得。 int system(const char *command) 执行 command 串的操 作系统命令返 回 值 就 是 指 定 命令执行所返回的 值, 0 表示正常 启动命令后等待返回。 void qsort( void *base, size_t num, size_t width, int ( cdecl *compare ) (const void *eleml, const void *elem2 ); 对任意类型的数组进行 快速排序(冒泡排序的 改进)。 base是数组 名, num 是元素个数, width是元素的字节大 小,最后形参是比较函 数指针 比较函数返回 0, 表示两 元 素相等。升序排序要求:返 回值小于0, 表示elemi 小于elem2:返回大于 0,表 示elemi 大 于 elem20降序相反。 void *bsearch (const void *key, const void *base, size t num, size t width, int ( cdecl *compare ) const void *eleml, const void *elem2 ); 折半查找, base 数组 元 素要按升序排序,元素 个数为 num, 元素大小为 width字节,查找key, 最后?个形参是比较函 数的指针。 如果未找到,就 返回 NULLo 女 II 果 找到就返回指 针 指向数组中的 key 如果数组未按升序排序, 或者元索有重复,那么结 果可不可预测。 比较函数与 qsort耍求 相 同。 动态内存管理 void *malloc(size_t size ); 动态请求分配size字 节的内存,但可能得到 更大空间,因为内存分 块管理。 如果内存不够, 就返回 NULL。否 则返回指针指向 所分配的内存 用 free函数來回收内 存。 C 基础两数,许多其 它函数要调用该函数。 void *calloc (size t num, size_t size ); 动态请求分配一个数 组,而且初始化为0。 num 个元素,每个元素 大小为 size个字节 同上 void *realloc (void *memblock, size t size ); 对己分配的空间重新分 配,可改变人小。如果 第一个形参为NULL, 就 等同于 malloc函数 同上 void free (void *memblock ); 动态回收所分配的内 存,实参指针一定是用 malloc calloc 或 realloc得到的 如果实参指针错误,可能 导致不可预料的错误 数据转换 int tolower(int c); 将字符 c 转换为小写, 如果可能的话 小写字符 int toupper (int c); 将字符 c 转换为大写, 如果可能的话 大写字符 int atoi(const char * string) 字符串转换为整数整数 double atof (const char * string) 字符串转换为double doubig 值 double strtod(const char ring, char *endptr ); 字符串转换到double, 而且得到停止指针 double 值 第 2 个形参得到字符串中 停止扫描的字符指针。 strtol函数处理 long strtoul 处理 unsigned long char * itoa (int value, char *string, int radix); 将 int型 value按基 数 redix转换到字符串 string 返回结果串 棊数范围 2-36 。 ltoa函数针对 long 型。针对unsigned long 型 char *_gcvt(double value, int digits, char buffer); 将 double 型 value 转换到字符缓冲区 buffer + 返回结果串第 2 个形参确定有效位 数 char *_ecvt(double value, int count, int *dec, int *sign); 将 double 型 value 转换到字符串,第2 个 形参确定总的冇效位数 返回结果串, 串中无小数点 第 3 个形参得到小数点位 置(0 和负值表示小数点 在数字左边),第4 个形 参得到符号位(0 为 正, 1 为负) char *_fcvt(double value, int count, int *dec, int *sign); 将 double 型 value 转换到字符串,第2 个 形参确定小数点后的有 效位数 返回结果串, 串中无小数点 第 3 个形参得到小数点位 置(0 和负值表示小数点 在数字左边),第4 个形 参得到符号位(0 为 正, 1 为负) 表B-7字符串函数 size t是用 typedef定义的 unsigned int的同义词。 NULL 是值为 0 的広,每个串char*都 以 NULL 结尾。形参中所冇const修饰的串都不可改变,反之,无const修饰的串都可改变,而H 作为结 果。注意,用NULL 作为实参调用下面函数将导致运行错谋。 函数原型功能返回值说明 int strlen (const char *string) 求字符串的长度字符串包含的字符个数 char * strcpy (char *sl, const char *s2) 将 S2 串拷贝到 si中目的存储区的始址S1 char *strncpy (char *pl, const char *p2, size t count ); 将 s2 串拷贝到 pl中, 只拷贝 count个字符 同上 int strcmp(const char *sl, const char *s2) 比较两个字符串S1 和 s2 如两串相同,就返回0。 si串小于 s2 串,返回负 数,否则返回正数 从前向后逐个字 符比较 int strncmp(const char *slz const char *s2z size_t count ); 比较两个字符串81 和 s2, 只比较前 count个 字 符 同上 int stricmp (const char *sl, const char *s2); 比较两个字符串S1 和 s2, 而且忽略大小写 同上 int strnicmp(const char *sl, const char *s2z size_t count ); 比较两个字符串S1 和 s2, 只比较前 count个 字 符,而且忽略大小写 同上 char * strcat(char *sl, const char * s2) 将 s2 串拼接到 si串的 后面 目的存储区的始址S1 char *strncat (char *slz const char *s2, size_t count ); 将 s2 串拼接到 si串的 后面,只拼接前count 个 字符 同上 char strrev ( char string ); 转换为逆向串返回结果串 char * strlwr ( char *string); 转换为小写串返回结果串 char *_strupr ( char string ); 转换为大釘串返回结果串 char *strchr (const char *sz int c); 在 S 串中查找字符C 的首 次出现位置 如找到,返回指针指向该 字符位置。如未找到,返 回 NULL char *strrchr (const char *sz int c ); 在 S 串中査找字符C 的最 后出现位置 如找到,返回指针指向该 字符位置。如未找到,返 回 NULL char * strstr (const char *sl, const char *s2) 查找子串,在S1 串屮从 前向后查找 s2 串首次出 现位置 如找到 , 就返回 sl + s2 出现的位置 , 否则就返回 NULL s2 作为一个串 char rtrpbrk (const char *slz const char *s2); 在 si串中从前向后查找 s2 中某个字符出现的位置 如找到,返回S1 的位 置。如果 si和 s2 没有 共 同字符,返回NULL s2 作为一个字符 集,而不是串。 如, sl= nxyzabgn s2= ,l abc t, 返冋 7bg“ size t strspn (const char *sl z const char *s2); 在 si串中从前向后计数 s2 中字符的个数。即求S1 串中前而有多少个字符在 S2 范围中。 返回幣数表示在S1 串中 第 一个不在 s2 中的字符的位 蜀。如果 S1 串的第 1 个字 符不在 S2 中,就返回 0。 s2 作为一个字符 集,而不是串。 如, sl= ncabbageH s2= , abc ,1 返回 5 size_t strcspn (const char *slr cons t char *s2); 在 S1 串中从前向后计数不 在 s2 中字符的个数。 即求 S1 串中前面有多少个 字符都不在 s2 范围 中。 返回整数表示在S1 串屮 第 一个在S2 中的字符的位 置。如果 S1 串第 1 个 字符 在 s2 中,就返冋 0。 s2 作为一个字符 集,而不是串。 如, sl= nxyzabcn s2= nabcn 返回 3 char *strtok(char *slz const char *s2); 在 si串中査找 s2 中的 分 割符,并用 NULL 替代 分隔 符,使 si分割为多个子串 标记 token 返回第一个分隔符所分割 的 token串。下而调用用 NULL 作为 si的实参,可 获取后面的字串标记 s2 作为一个分隔 字符集,而不是 串。 缓冲区管理(按字节处理) void * memcpy (void *sl, const void *s2, size t count) 将 s2 所指的共 count 个 字节拷贝到 si所指存储 区中 目的存储区的始址S1 内存拷贝 int memcmp(const void *sl z cons t void *s2z size_t count ); 比较 si和 s2 所指的区 域中各字节的值,比较 count个字节 如全相同,返回0. 如果 si小于 s2, 返回负 值,否则就返冋正值 内存比较 void * memset(void *bufz int c, size t count) 将 buf所指区域设置为c 值,区域大小count 字节 该区域的起始地址buf 内存设置 void *memchr (const void *bufz int cz size_t count ); 在 buf所指区域中査找c 值,区域人小count 字节 如找到,返回指针指向找到 的字节地址, 如未找 到,返 回 NULL 内存査找 表B_8 时间函数t ime. h 与sys/t imeb. h 表中time t是long的同义词。 函数原型功能返回值说明 time t time ( time t *timer ); 取得系统当前时间,形参 用来保存结果。如实参为 NULL, 返回值但不保存 一个整数值,表示从 1970-1-1 00: 00: 00 到当前时间的秒数 time t 是 long 型。 该值每秒改变, 常作为伪随机数 种子 struct tm *localtime 将 time t时间转换为返回 tm 结构值,包括:1 浙数 gmtime (const time_t 壮 imer ); tm 时间,而 R 按本地时 区调整。 tm_sec:0-59 tm_min:0-59 tm hour:0-23 tm day:1-31 tm mon: 0-11, 1 月为 0 tm_year 1900 开始 tm_wday: 0 - 6,周 口 为 0 tm_yday:0-365,1 月 1 H 为 o 转换到当前国际 标准时间UTC char *asctime( const struct tm *timeptr ); 将 tm 吋间转换为字符串 0 返回字符串,格式为: Wed Jan 02 02:03:55 1980 char *ctime( const time t *timer ); 将 time_t吋间转换为字 符串,带时区调整 同上 time t mktime( struct tm *timeptr ); 将 tm 时间转换为time_t 时间, 5 结构 中前 6 项就 可以构造一个有效吋间。 如果转换错误,返回 判断方法如下: mktime() !=(time_t )-1 与 localtime 函数作用相反 char * strtime(char * timestr); 把当前 ?系统时间转换为 字符串,形参是输出串 指向结果串格式为: hh:mm:ss char *_strdate char *datestr ); 把当前系统日期转换为 字符串,形参是输岀串 指向结果串 格式为: mm/dd/yy size t strftime(char *strDestz size t maxsize, const char format, const struct tm 壮 匚 meptr ); 对 tm 吋间转换为一个格 式化字符串,用于显示。 结果串的长度 第 3 个实参耍 使用大量的格式 控制符,请参看 文档。 clock t clock( void ); 计算处理器所用时间。 可用于延迟或时间区间 度量,精确到毫秒。 返回时钟滴答数量。clock t 是一个long 。 CLOCK_PER_SEC 表示每秒 时钟滴答数的常量,如 1000c 两次调用返回值 之羞就是间隔的 毫秒数。 void _ftime( struet timeb 壮 imepti:); 获取系统当前时间,形参 用來保存结果。 _timeb 结构中包含成员: dstflag:非 0 表示夏令 时 millitm:亳秒数time: 即 time t值 timezone: 相对 UTC 的 时间差 ( 以分钟为单位) , 如中国为 -480,比 UTC 早 8 小时 比 localtime 函数得到更多信 息 void tzset ( void ); 根据当前坏境变量來设在执行 置 3 个全局变量:_daylight , _timezone 和 _tzname? 详见 MSDN 文 档 表B-9可变参数stdarg. h 函数原型 ( 有参宏 )功能返回值说明 void va start (va list arg ptr, prev param ); 可变参数初始化,使参数X arg_ptr 指向周定形参prev_paramZ后的头一 个可变形参 先用 va_list 说明一个变量, 再作为本函数的 头?个实参 va arg ( va list arg_ptrz type ); 将 arg_list中的当前实参转换为指 定类型 type之后, 再返回。返回前指 向下一个可变实参。 返回读取到 的实参值 循环调用该函数将 得到多个可变实参 void va end( va list arg_ptr ); 对可变参数表进行复位最后一步 表BT0 断言assert. h 与crtdbg. h 函数原型 ( 有参宏 )功能返回值说明 void assert ( int expression ); 定义在 assert ? h 计算指定的表达式,如果为0 (false),就打印该表达式、文件名及 行号,然后调用abort () 函数终止程 序。如果表达式计算为非O(true),不 显示任何信息,也没有其它动作。 该宏在调试和运行时都可起作用。如要 停止起作用,只需在包含前定义NDEBUG 宏。 在程序中添加诊断 断言,以确保满足 特定条件才能继续 执行。这是故简单 的程序检测手段。 ASSERT( boolExpr); ASSERTE(boolExpr); 定义 在crtdbg. h中 这两个宏与 assert相似。只在 _DEBUG宏冇效时才起作用,即只在调 试程序时才起作用,在运行时刻不起作 用。 _ftime 、 time 或 localtime 1*1数前应先 执 行该函数