C++程序设计常用库函数.docx
《C++程序设计常用库函数.docx》由会员分享,可在线阅读,更多相关《C++程序设计常用库函数.docx(19页珍藏版)》请在冰豆网上搜索。
C++程序设计常用库函数
C++程序设计常用库函数
本文主要涉及两类库函数,运行期库(run-timelibrary)和C++标准库。
下面简单介绍这些库的使用要点。
运行期库是用C语言实现的基础程序库,其它库都以此为基础。
MSDN将运行期库按功能划分,如表B-1所示。
来自MSDNLibraryVisualStudio6.0
VisualC++Documentation
UsingVisualC++
VisualC++Programmers’sGuide
Run-TimeLibraryReference
Run-TimeRoutinesbyCategory
表B-1运行期库
分类
功能
相关头文件(不完全)
可变参数
用于定义可变参数的函数
缓冲区管理
按字节管理内存缓冲区
按字节分类
多字节字符分类,与当前多字节代码页相关
按字符分类
对单字节字符、宽字符、多字节字符进行分类。
比较常用,如isalpha,isprint。
数据转换
一种数据转换到另一种,例如字符串到int或double,或反之。
有很多转换既有函数实现,也有宏实现,可选择。
调试程序
debug调试,函数库中有专门的调试版本,支持单步执行、断言、错误检测、异常,跟踪堆空间分配,避免内存泄露,以及调试信息报告等。
目录控制
读取或改变目录,创建、删除目录等,也包括使用环境路径来搜索文件
错误处理
包括断言、检测IO错误、清除错误标记、判断低级IO的文件尾eof等。
异常处理程序
程序终止处理(terminate)、意外处理(unexpected)
文件处理
对磁盘文件的建立、删除、改名、文件访问许可等操作。
浮点数支持
专门针对浮点数的计算,如指数、对数、三角函数、双曲函数等,也包括错误检测,如溢出。
输入输出
从文件或设备中读入数据或写出数据。
文件IO要区分文本模式和二进制模式。
IO分为以下三类:
1、流式IO,将数据作为字符或字节序列,有缓冲。
2、低级IO,直接调用操作系统,无缓冲。
3、控制台与端口IO,对键盘和字符显示器的直接读写,对IO设备,如打印机、串行口的直接读写。
国际化
适应不同语言,与地域locale相关程序、宽字符、多字节字符、通用文本等等。
内存分配
动态分配、回收内存,如malloc、free等函数。
进程控制与环境控制
进程的启动、停止与管理,也包括线程的启停。
操作系统环境信息的读取与改变。
排序与查找
对任意类型数组进行排序,折半查找与线性查找。
字符串管理
对以NULL结尾的各种字符串进行操作
系统调用
用来查找文件的3个函数
时间管理
获取当前系统日期时间、转换、调整等操作
注1MSDN按以上19类功能对运行期库分组。
注2同一个函数可能出现在不同功能分组中,也可能出现在不同的头文件中。
注3运行期库是纯C语言实现,不包含C++的内容(没有重载、形参缺省值、引用、模板等)。
表B-2运行期库头文件
头文件名
功能
C++包装头文件名
断言设置
字符分类
由库函数执行,检测错误代码
浮点数计算
ISO646字符集处理
检测整数类型的性质
不同地域文字适应性
公共数学计算
执行非本地goto语句
控制各种异常条件
可变参数的函数
多种有用的类型(typedef)和宏的定义
输入和输出
多种操作函数
多种字符串的处理
系统时间处理
宽字符流,以及特殊字符串处理
宽字符分类
注1,表中列出的18个头文件是作为C++标准库,而运行期库的头文件还有许多未列入。
注2,C++标准库的头文件大多不含.h后缀。
注3,左边头文件内容被包装到C++标准的命名空间std中。
例如,文件大致如下:
namespacestd{#include};
表B-3标准C++库头文件
头文件名
功能
算法,提供了70多个模板函数,通过迭代器作用于各种容器,实现排序、查找、集合运算等算法。
位集,一个模板类和两个支持模板函数。
复数,一个模板类和若干模板函数
双端队列容器,1个模板类和3个支持模板
定义异常基类exception,若干模板函数,类似中的定义
支持磁盘文件的iostream操作
提供模板类以构建函数对象,类似于函数指针,供各种容器和算法使用
定义带参格式控制符,用于控制输出格式
定义了basic_ios类,作为iostream的基类
定义了对几种模板类的正向引用,供iostream使用
定义了几个对象,对标准流进行读写,如cin,cout,cerr,clog等。
对ISO646字符集的处理
输入流,定义了模板类basic_istream和basic_iostream
迭代器,用于访问容器中的元素,也用于调用各种算法。
定义了模板类numeric_limits,其中规范了算术计算中各种类型的值范围
列表,基于双向链表的一种容器。
提供一组模板类和函数,封装和管理地域locale信息,以支持多国文字习惯用法。
映射容器,提供了一个映射map和一个多射multimap。
一个类,一个运算符和若干函数用于请求分配与回收对象
提供若干模板函数,用于数值计算,如求和、求乘积、求部分和等。
输出流,定义了basic_osrteam,还有格式控制符
队列容器,包含一个队列和一个优先级队列。
集合容器,包含一个集合set和一个多集multiset。
支持对数组对象的iostream操作,支持与basic_string的转换
堆栈容器,stack模板类
标准异常类型,以exception为基类,定义了一组派生类来描述各种异常类型。
定义了basic_streambuf模板类,作为一组iostream类的基础
定义了basic_string模板类,一种容器,其中用typedef定义了string类型。
支持对字符数组对象的iostream操作,支持与C字符串的转换
定义了对偶pair,作为映射和多射的基本元素
定义了valarray模板类,支持可变长的数组
向量容器,1个模板类和3个支持模板
注1,表中列出了32个头文件,加上前面18个包装头文件,共50个头文件,组成C++标准库。
注2,还有几个头文件未列入文档,、、,它们没有被完整实现。
注3,上表中包含了10个新版本的IO流头文件,而老版本只有8个头文件,对应关系如下表。
表B-4IO流的新旧头文件对比
旧版本IO流头文件
新版本IO流头文件
注1,同一行上的两个头文件具有大致相同的功能,但内部具体类型有差别。
注2,新老版本不能用在同一个项目中,因为它们使用不同的库文件(lib文件和dll文件)。
下面是一些常用的运行期库。
表B-5数学函数
函数原型
功能
返回值
说明
intabs(intx)
longlabs(longx)
doublefabs(doublex)
求绝对值
绝对值
doublepow(doublex,doubley)
求x的y次方
计算结果
doublesqrt(doublex)
求x的平方根
计算结果
doublefmod(doublex,doubley)
求x除以y的余数
余数
使x=i*y+f,f是返回值,i是整数,且f与x相同符号
doubleceil(doublex)
大于等于x的最小整数
如ceil(2.8)==3
doublefloor(doublex)
小于等于x的最大整数
如floor(2.8)==2
doublemodf(doublex,double*y)
取x的整数部分送到y所指向的单元中
x的小数部分
将浮点数x分解为整数部分和小数部分,如-2.3分解为-2和-0.3
doubleexp(doublex)
e的x次方
doublelog(doublex)
自然对数ln(x),以e为底的对数
x>0
doublelog10(doublex)
以10为底的对数
x>0
三角函数
doublesin(doublex)
doublesinh(doublex)
正弦sin(x)
双曲正弦sinh(x)
计算结果
x为弧度值
doublecos(doublex)
doublecosh(doublex)
余弦cos(x)
双曲余弦cosh(x)
计算结果
x为弧度值
doubletan(doublex)
doubletanh(doublex)
正切tan(x)
双曲正切
计算结果
x为弧度值
doubleasin(doublex)
反正弦arcsin(x)
-1≤x≤1
doubleacos(doublex)
反余弦arccos(x)
计算结果
-1≤x≤1
doubleatan(doublex)
反正切arctan(x)
计算结果
表B-6C标准库
函数原型
功能
返回值
说明
voidsrand(unsignedintseed)
设置伪随机数序列的起点,即随机数生成种子
先设置种子,再调用rand生成随机数
intrand(void)
生成一个伪随机整数
随机正整数,>0
voidabort(void)
终止进程,而没有刷新缓冲区,也没有执行清理
不到万不得已,不要调用
voidexit(intstatus)
先执行清理,刷新缓冲区,关闭打开的文件,最后终止进程
返回0表示正常,其它值表示错误。
返回值可被操作系统的批处理命令获得。
intsystem(constchar*command)
执行command串的操作系统命令
返回值就是指定命令执行所返回的值,0表示正常
启动命令后等待返回。
voidqsort(void*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));
对任意类型的数组进行快速排序(冒泡排序的改进)。
base是数组名,num是元素个数,width是元素的字节大小,最后形参是比较函数指针
比较函数返回0,表示两元素相等。
升序排序要求:
返回值小于0,表示elem1小于elem2;返回大于0,表示elem1大于elem2。
降序相反。
void*bsearch(constvoid*key,constvoid*base,size_tnum,size_twidth,int(__cdecl*compare)(constvoid*elem1,constvoid*elem2));
折半查找,base数组元素要按升序排序,元素个数为num,元素大小为width字节,查找key,最后一个形参是比较函数的指针。
如果未找到,就返回NULL。
如果找到就返回指针指向数组中的key
如果数组未按升序排序,或者元素有重复,那么结果可不可预测。
比较函数与qsort要求相同。
动态内存管理
void*malloc(size_tsize);
动态请求分配size字节的内存,但可能得到更大空间,因为内存分块管理。
如果内存不够,就返回NULL。
否则返回指针指向所分配的内存
用free函数来回收内存。
C基础函数,许多其它函数要调用该函数。
void*calloc(size_tnum,size_tsize);
动态请求分配一个数组,而且初始化为0。
num个元素,每个元素大小为size个字节
同上
void*realloc(void*memblock,size_tsize);
对已分配的空间重新分配,可改变大小。
如果第一个形参为NULL,就等同于malloc函数
同上
voidfree(void*memblock);
动态回收所分配的内存,实参指针一定是用malloc、calloc或realloc得到的
如果实参指针错误,可能导致不可预料的错误
数据转换
inttolower(intc);
将字符c转换为小写,如果可能的话
小写字符
inttoupper(intc);
将字符c转换为大写,如果可能的话
大写字符
intatoi(constchar*string)
字符串转换为整数
整数
doubleatof(constchar*string)
字符串转换为double
double值
doublestrtod(constchar*string,char**endptr);
字符串转换到double,而且得到停止指针
double值
第2个形参得到字符串中停止扫描的字符指针。
strtol函数处理long
strtoul处理unsignedlong
char*_itoa(intvalue,char*string,intradix);
将int型value按基数redix转换到字符串string
返回结果串
基数范围2-36。
_ltoa函数针对long型。
_ultoa针对unsignedlong型
char*_gcvt(doublevalue,intdigits,char*buffer);
将double型value转换到字符缓冲区buffer中
返回结果串
第2个形参确定有效位数
char*_ecvt(doublevalue,intcount,int*dec,int*sign);
将double型value转换到字符串,第2个形参确定总的有效位数
返回结果串,
串中无小数点
第3个形参得到小数点位置(0和负值表示小数点在数字左边),第4个形参得到符号位(0为正,1为负)
char*_fcvt(doublevalue,intcount,int*dec,int*sign);
将double型value转换到字符串,第2个形参确定小数点后的有效位数
返回结果串,
串中无小数点
第3个形参得到小数点位置(0和负值表示小数点在数字左边),第4个形参得到符号位(0为正,1为负)
表B-7字符串函数
size_t是用typedef定义的unsignedint的同义词。
NULL是值为0的宏,每个串char*都以NULL结尾。
形参中所有const修饰的串都不可改变,反之,无const修饰的串都可改变,而且作为结果。
注意,用NULL作为实参调用下面函数将导致运行错误。
函数原型
功能
返回值
说明
intstrlen(constchar*string)
求字符串的长度
字符串包含的字符个数
char*strcpy(char*s1,constchar*s2)
将s2串拷贝到s1中
目的存储区的始址s1
char*strncpy(char*p1,constchar*p2,size_tcount);
将s2串拷贝到p1中,只拷贝count个字符
同上
intstrcmp(constchar*s1,constchar*s2)
比较两个字符串s1和s2
如两串相同,就返回0。
s1串小于s2串,返回负数,否则返回正数
从前向后逐个字符比较
intstrncmp(constchar*s1,constchar*s2,size_tcount);
比较两个字符串s1和s2,只比较前count个字符
同上
int_stricmp(constchar*s1,constchar*s2);
比较两个字符串s1和s2,而且忽略大小写
同上
int_strnicmp(constchar*s1,constchar*s2,size_tcount);
比较两个字符串s1和s2,只比较前count个字符,而且忽略大小写
同上
char*strcat(char*s1,constchar*s2)
将s2串拼接到s1串的后面
目的存储区的始址s1
char*strncat(char*s1,constchar*s2,size_tcount);
将s2串拼接到s1串的后面,只拼接前count个字符
同上
char*_strrev(char*string);
转换为逆向串
返回结果串
char*_strlwr(char*string);
转换为小写串
返回结果串
char*_strupr(char*string);
转换为大写串
返回结果串
char*strchr(constchar*s,intc);
在s串中查找字符c的首次出现位置
如找到,返回指针指向该字符位置。
如未找到,返回NULL
char*strrchr(constchar*s,intc);
在s串中查找字符c的最后出现位置
如找到,返回指针指向该字符位置。
如未找到,返回NULL
char*strstr(constchar*s1,constchar*s2)
查找子串,在s1串中从前向后查找s2串首次出现位置
如找到,就返回s1中s2出现的位置,否则就返回NULL
s2作为一个串
char*strpbrk(constchar*s1,constchar*s2);
在s1串中从前向后查找s2中某个字符出现的位置
如找到,返回s1中的位置。
如果s1和s2没有共同字符,返回NULL
s2作为一个字符集,而不是串。
如,
s1="xyzabg"
s2="abc"
返回"abg"
size_tstrspn(constchar*s1,constchar*s2);
在s1串中从前向后计数s2中字符的个数。
即求s1串中前面有多少个字符在s2范围中。
返回整数表示在s1串中第一个不在s2中的字符的位置。
如果s1串的第1个字符不在s2中,就返回0。
s2作为一个字符集,而不是串。
如,
s1="cabbage"
s2="abc"
返回5
size_tstrcspn(constchar*s1,constchar*s2);
在s1串中从前向后计数不在s2中字符的个数。
即求s1串中前面有多少个字符都不在s2范围中。
返回整数表示在s1串中第一个在s2中的字符的位置。
如果s1串第1个字符在s2中,就返回0。
s2作为一个字符集,而不是串。
如,
s1="xyzabc"
s2="abc"
返回3
char*strtok(char*s1,constchar*s2);
在s1串中查找s2中的分割符,并用NULL替代分隔符,使s1分割为多个子串标记token
返回第一个分隔符所分割的token串。
下面调用用NULL作为s1的实参,可获取后面的字串标记
s2作为一个分隔字符集,而不是串。
缓冲区管理(按字节处理)
void*memcpy(void*s1,constvoid*s2,size_tcount)
将s2所指的共count个字节拷贝到s1所指存储区中
目的存储区的始址s1
内存拷贝
intmemcmp(constvoid*s1,constvoid*s2,size_tcount);
比较s1和s2所指的区域中各字节的值,比较count个字节
如全相同,返回0.
如果s1小于s2,返回负值,否则就返回