您的位置:首页 > 编程语言 > C语言/C++

C语言常用库函数总结

2015-05-14 09:15 316 查看
1、存储分配
2、随机数生成
3、数字转换
4、环境通信
5、搜索与排序
6、整型算术
7、多字节、宽字符和字符串转换
8、时间与日期
9、区域设置
10、其它

1、存储分配

void* malloc(size_t size);
void* calloc(size_t elt_count, size_t elt_size);
void* realloc(size_t *ptr, size_t size);
void free(void *ptr);

malloc函数分配足够大的内存区域长度(用sizeof运算符计算)为size的对象,返回这个区域中第一个元素的指针,并保证对任何数据类型正确对齐。调用者可以用类型转换运算符将这个指针转换成另一指针类型,标准C语言中并不严格要求类型转换,在赋值时可以进行隐式转换,为了保证C++兼容性,需要进行类型转换。如果是由于某种原因无法进行请求的分配,则返回null指针。如果请求的长度为0,则标准C语言函数返回一个null指针或不能用于访问对象的非null指针。分配的内存不进行任何初始化,因此调用者无法依赖其内容。由于通过malloc分配的区域要保证对任何数据类型正确对齐,因此每个区域实际占用内存块是对齐长度的位数,通常为4或8个字节。
calloc分配足够大的内存区来存储elt_count个元素的数组,每个元素的长度(用sizeof运算符计算)为elt_size。内存区按位清0,返回该区域第一个元素的指针。
realloc所带参数为前面由某个标准函数分配的内存区的指针,在保留其内容的同时改变其长度。
free释放前面由malloc、calloc、realloc分配的内存区,只能释放一次,释放之后不能再使用。

2、随机数生成

int rand(void);
void srand(unsigned seed);
#define RAND_MAX 0x7fff

rand返回的整数值范围在0到int类型可以表示的最大正值之间,是伪随机数生成器的连续结果,在标准C语言中,rand范围的上限由RAND_MAX指定,至少为32767。
srand可以初始化调用rand时生成连续值的伪随机数生成器,如果seed相同,那么再次调用rand时将生成一系列相同的伪随机数,通常将seed设为time(0),这样便可产生真正意义上的随机数。

3、数字转换

标准C语言提供了一系列把字符串转换为数字的函数,形式为atoxstrtox,例如下面的两个函数:

double atof(const char *str);
double strtod(const char* restrict str, char** restrict ptr);

4、环境通信

void exit(int status);
void _Exit(int status);
void abort(void);
int atexit(void (*func)(void));

exit正常终止程序,并进行一些清理操作:所有向atexit函数注册的函数按与注册相反的顺序调用,注册几次就调用几次;刷新打开的输出流,关闭所有打开的数据流;删除tmpfile函数生成的文件;控制返回宿主环境,提供状态值。
_Exit也是终止程序,与exit不同之处在于既不调用atexit注册的退出处理器,也不调用signal注册的信号处理器,是否进行其它清理操作是由实现定义的,如关闭所有打开的数据流,_Exit是C99增加的,传统上有些实现用名为_exit的函数提供类似功能。
abort使程序异常终止,调用abort转换成可以捕获的特殊信号,标准C语言为SIGABRT,断言失败会调用abort。
atexit注册一个函数,使得调用exit或函数main返回时会调用这个函数,程序异常终止时(如用abort或raise终止),不调用注册的函数,实现应允许至少注册32个函数。注册函数不能引用任何不是自己定义的存储类为auto或register的对象(例如通过指针引用)。

char* getenv(const char *name);

getenv返回环境变量name的值,编程人员不能修改返回的字符串,main函数的第三个非标准参数env(类型为char**)提供了环境变量(name,value)绑定集。

int system(const char *command);

system将command传递到操作系统的命令处理器,按实现定义的方式执行,返回值通常是这个命令的完成状态。

Unix系统还提供了一系列exec函数,所有情况下,它们执行函数第一个参数中的程序,把当前进程变成新进程,各个函数的差别在于新进程的参数如何提供。

#include <assert.h>
#ifndef NDEBUG
void assert(int expression);
#else
#define assert(x) ((void)0)
#endif

assert通常在程序开发期间用于验证某些条件在运行是是否为真,expression为0时在stdout中打印一个诊断消息,包括参数文本、文件名(__FILE__)、行号(__LINE__)、函数名(__func__)。

#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int status);

setjmplongjmp实现基本形式的非本地跳转,可以处理异常或例外情形,比signal更好移植。一般先调用setjmp设置env,后面可能会执行longjmp,然后跳转到setjmp,其返回值为longjmp的参数status。

#include <signal.h>
#define SIG_xxx …
#define SIGxxx …
void (*signal(int sig, void (*func)(int)))(int);
int raise(int sig);
/************************/
/* Non-Standard extensions: */
int kill(int pid, int sig);
int (*ssignal(int softsig, int (*func)(int)))(int);
int gsignal(int softsig);
void psignal(int sig, char *prefix);

信号是异步事件,用整数值指定,以字母SIG开头。信号的触发可以通过计算机的错误勘探机制、用户程序中的killraise函数以及程序外部的操作。ssignalpsignal使用的软件信号是用户自定义的,数值通常在1到15之间。

另外,非标准C语言还提供了sleepalarm,前者使程序暂停指定秒数,后者将内部系统定时器设置为指定秒数返回原先定时器上的秒数,定时器超时时,程序发出信号SIGALRM

5、搜索与排序

void* bsearch(const void *key, const void *base, size_t count, size_t size,
int (*compar)(const void *the_key, const void *a_value));
void qsort(void *base, size_t count, size_t size,
int (*compar)(const void *element1, const void *element2));

bsearch搜索count个元素的数组,其第一个元素是base所指的元素,字符中每个元素的长度是size,compar函数的参数是指向关键字的指针和指向一个数组元素的指针,返回的负值、0和正值分别表示关键字小于、等于和大于这个元素,搜索开始时,数组要按升序排序(根据compar),bsearch返回数组中与key匹配的元素的指针,如果找不到这样的元素,则返回null指针。
qsort排序count个元素的数组。

6、整型算术

int abs(int x);
long labs(long int x);
long long llabs(long long int x);
div_t div(int n, int d);
ldiv_t ldiv(long n, long d);
lldiv_t lldiv(long long n, long long d);

abs求绝对值,div求除法,这些整型算术函数在stdlib.h中定义,另外在math.hcomplex.h中还定义了许多其它类型的数学运算函数,tgmath.h中定义了一组通用类型宏,用于提高数学函数或复数函数的移植性。

7、多字节、宽字符和字符串转换

标准C语言可以处理扩展的特定区域设置的字符集,这些字符集非常大,无法在一个char类型对象中表示每个字符,对于这种字符集,标准C语言提供了内部和外部表示模式。在内部,扩展字符假设为适合宽字符,这些宽字符是由实现定义的整型类型wchar_t的对象。在外部,一个宽字符可以表示为正常字符的序列,即对应于宽字符的多字节字符。标准C语言提供了一些用于处理宽字符、多字节字符的函数,这些函数以wcmb开头。

8、时间与日期

time.h定义了一些函数用以提供日历日期和时间及处理器时间,下面一一介绍。

#define CLOCKS_PER_SEC ...
clock_t clock(void);

clock返回当前进程使用处理器时间的近似值,常用于衡量程序或部分程序的运行快慢。
CLOCKS_PER_SEC定义了时钟滴答,即每秒的时间单位数。

time_t time(time_t *tptr);

time返回当前日历时间,如果参数tptr不是null,则返回值还存放在*tptr中。

char* asctime(const struct tm *ts);
char* ctime(const time_t *timptr);

asctime(参数是结构化日历时间的指针)或ctime都返回可打印日期与时间字符串的指针,其形式如下所示:
“WedMay 13 20:12:00 2015\n”

struct tm {...};
struct tm* gmtime(const time_t *t);
struct tm* localtime(const time_t *t);
time_t mktime(struct tm *tmptr);

gmtimelocaltime将time函数返回的算术日历时间转换成tm结构体类型的分解形式,gmtime转换GMT时间,而localtime转换本地时间,还要考虑时区和夏时制等因素。
mktime从参数tmptr指定的经过分解的本地时间构造time_t类型的值。

double difftime(time_t t1, time_t t0);
difftime只在标准C语言中提供,从日历时间t1减去日历时间t0。

size_t strftime(char *s, size_t maxsize, const char *format,

const struct tm *timeptr);
size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format,

const struct tm *timeptr);

strftime和sprintf一样,在多字节字符串format控制下将字符存放在参数s所指的字符数组中,但只格式化timeptr指定的一个日期和时间量,format中的格式代码与sprintf中有不同解释。s指定的数组中不能放超过maxsize个字符(包括终止null字符),返回存储的实际字符数(不包括终止null字符),如果maxsize不够大,放不下整个格式字符串,则返回0,放弃输出字符串内容的定义。strftime格式是特定区域设置的,使用LC_TIME类别,可用setlocale设置。
wcsftime可以将日期与时间格式化成宽字符串,与wsprintf相似。

9、区域设置

标准C语言是为国际化社区设计的,其成员使用不同字母和不同的数字、币值、日期与时间格式规则。C语言标准允许实现根据不同情况调整运行库行为,同时保证一定的跨国移值性。国家、文化和语言规则称为区域设置,locale.h头文件定义了区域设置相关的函数。区域设置影响数字与币值格式、字母表与排序顺序和日期与时间格式。运行时可以从实现定义的区域设置集选择不同区域设置。标准C语言只定义了C语言区域设置,这一区域设置指定与原始C语言定义一致的最基本环境。

char* setlocale(int category, const char *locale);
struct lconv* localeconv(void);

setlocale改变运行库的区域设置特定特性,category以LC_开头,例如LC_CTYPE,如果locale为null,返回当前category的区域设置值。
localeconv取得当前区域设置中格式化数字与币值的规则信息,返回的字符串不能改变。

10、其它

stdint.hinttypes.h提供了具有不同特征的整数类型的其它声明,包括准确长度类型、最小长度类型least、快速长度类型fast、指针长度类型ptr、最大长度类型max,以及一些类型转换函数。
fenv.h补充了float.h中的信息,可以对需要高精度控制浮点数运算精度或性能的应用程序提供对浮点数环境的访问,例如浮点数环境设置、浮点数异常控制、舍入方式等。
complex.h提供了支持复数算术的函数。
wctype.hwchar.h提供了支持多字符(串)、宽字符(串)的定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: