【C】C语言标准库函数总结

0、简介
1、C++兼容性
2、库文件列表
3、字符处理
4、字符串处理
5、内存函数
6、输入输出函数
7、存储分配
8、随机数生成
9、数字转换
10、环境通信
11、搜索与排序
12、整型算术
13、多字节、宽字符和字符串转换
14、时间与日期
15、区域设置
16、其它

0、简介
C语言标准库支持字符和字符串、输入与输出、数学函数、日期与时间转换、动态存储分配和其它特性,这些库定义了一些类型、宏和函数。对定义为函数的库功能,标准C语言允许实现提供除真正函数以外的同名函数式宏,下面的方法可以绕过同名函数式宏cos。
#include <math.h>
double a, b, (*p)(double);
b = 0.5;
p = &cos;
a = (*p)(b); // 利用函数指针
a = (cos)(b); // 利用宏名后面不能紧跟一个开括号的特点
#undef cos // 或者直接取消宏定义

1、C++兼容性
C语言与C++的兼容性就是利用extern关键字,有下面四种用法。
用法一:
extern "C" int foo(int);
用法二:
extern "C" {
int foo(int);
}
用法三:
#ifdef __cplusplus
extern "C"
#endif
// ...
#ifdef __cplusplus
}
#endif
用法四:
extern "C" {
#include "library.h"
}

2、库文件列表
assert.h 断言
complex.h 复数
ctype.h C类型
errno.h 错误处理
fenv.h 环境变量
float.h 浮点数
inttypes.h 整型
iso646.h 运算符等
limits.h 限制
locale.h 区域
math.h 数学运算
setjmp.h 跳转指令
signal.h 信号
stdarg.h 可变参数
stdbool.h 布尔类型
stddef.h 标准定义
stdint.h 整型
stdio.h IO
stdlib.h 函数库
string.h 字符串
tgmath.h 函数运算
time.h 时间
wchar.h 宽字符
wctype.h 宽字符类型

3、字符处理
字符处理相关函数请参照 【C】C语言字符处理函数

4、字符串处理
字符串处理相关函数请参照 【C】C语言字符串处理函数

5、内存函数
内存函数请参照 【C】C语言内存函数

6、输入输出函数
输入输出函数请参照 【C】C语言数据流及输入输出函数

7 、存储分配

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分配的内存区,只能释放一次,释放之后不能再使用。

8、随机数生成

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),这样便可产生真正意义上的随机数。

9、数字转换

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

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

10、环境通信

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);

setjmp longjmp 实现基本形式的非本地跳转,可以处理异常或例外情形,比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开头。信号的触发可以通过计算机的错误勘探机制、用户程序中的 kill raise 函数以及程序外部的操作。 ssignal psignal 使用的软件信号是用户自定义的,数值通常在1到15之间。

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

11、搜索与排序

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个元素的数组。

12、整型算术

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.h complex.h 中还定义了许多其它类型的数学运算函数, tgmath.h 中定义了一组通用类型宏,用于提高数学函数或复数函数的移植性。

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

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

14、时间与日期

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);

gmtime localtime 将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相似。

15、区域设置

标准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 取得当前区域设置中格式化数字与币值的规则信息,返回的字符串不能改变。

16、其它

stdint.h inttypes.h 提供了具有不同特征的整数类型的其它声明,包括准确长度类型、最小长度类型least、快速长度类型fast、指针长度类型ptr、最大长度类型max,以及一些类型转换函数。
fenv.h 补充了float.h中的信息,可以对需要高精度控制浮点数运算精度或性能的应用程序提供对浮点数环境的访问,例如浮点数环境设置、浮点数异常控制、舍入方式等。
complex.h 提供了支持复数算术的函数。
wctype.h wchar.h 提供了支持多字符(串)、宽字符(串)的定义。


  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值