目录
1 标准库
1.1 诊断assert.h
assert.h中只定义了一个带参的宏assert,其定义形式如下:
void assert (int 表达式)
assert宏用于为程序增加诊断功能,它可以测试一个条件并可能使程序终止。 在执行语句:assert(表达式);
时,如果表达式为0,则在终端显示一条信息:
Assertion failed: 0, file 源文件名, line 行号
Abnormal program termination
然后调用abort终止程序的执行。 在assert.h中,带参宏assert是被定义为条件编译的,如果在源文件中定义了宏NDEBUG,则即使包含了头文件,assert宏也将被忽略。
1.2 字符类别测试ctype.h
在头文件中定义了一些测试字符的函数。在这些函数中,每个函数的参数都是整型int,而每个参数的值或者为EOF,或者为char类型的字符。中定义的标准函数列表如下:
ctype.h 中定义的函数
函数定义 | 函数功能简介 |
---|---|
int isalnum(int c) | 检查字符是否是字母或数字 |
int isalpha(int c) | 检查字符是否是字母 |
int isascii(int c) | 检查字符是否是ASCII码 |
int iscntrl(int c) | 检查字符是否是控制字符 |
int isdigit(int c) | 检查字符是否是数字字符 |
int isgraph(int c) | 检查字符是否是可打印字符 |
int islower(int c) | 检查字符是否是小写字母 |
int isprint(int c) | 检查字符是否是可打印字符 |
int ispunct(int c) | 检查字符是否是标点字符 |
int isspace(int c) | 检查字符是否是空格符 |
int isupper(int c) | 检查字符是否是大写字母 |
int isxdigit(int c) | 检查字符是否是十六进制数字字符 |
int toupper(int c) | 将小写字母转换为大写字母 |
int tolower(int c) | 将大写字母转换为小写字母 |
1.3 错误处理errno.h
errno.h中定义了两个常量,一个变量。
EDOM
:它表示数学领域错误的错误代码。
ERANGE
:它表示结果超出范围的错误代码。
errno
:这是一个变量,该值被设置成用来指出系统调用的错误类型。
1.4 整型常量limits.h
在limits.h头文件中定义了一些表示整型大小的常量。下面给出这些常量的字符表示以及含义,见下表。
limits.h中定义的字符常量
字符常量 | 取值 | 含义 |
---|---|---|
CHAR_BIT | 8 | char类型的位数 |
CHAR_MAX | 255或127 | char类型最大值 |
CHAR_MIN | 0或-127 | char类型最小值 |
INT_MIN | -32767 | int类型最小值 |
INT_MAX | 32767 | int类型最大值 |
LONG_MAX | 2147483647 | long类型最大值 |
LONG_MIN | -2147483647 | long类型最小值 |
SCHAR_MAX | 127 | signed char 类型最大值 |
SCHAR_MIN | -127 | signed char 类型最小值 |
SHRT_MAX | 32767 | short类型的最大值 |
SHRT_MIN | -32767 | short类型的最小值 |
UCHAR_MAX | 255 | unsigned char 类型最大值 |
UINT_MAX | 65535 | unsigned int 类型最大值 |
ULONG_MAX | 4294967295 | unsigned long 类型最大值 |
USHRT_MAX | 65535 | unsigned short类型的最大值 |
1.5 地域环境locale.h
在locale.h中,定义了7个常量,一个结构,2个函数。
常量的定义:
LC_ALL
:传递给setlocale的第一个参数,指定要更改该locale的哪个方面。LC_COLLATE
:strcoll和strxfrm的行为。LC_CTYPE
:字符处理函数。LC_MONETARY
:localeconv返回的货币信息。LC_NUMERIC
:localeconv返回的小数点和货币信息。LC_TIME
:strftime的行为。 以上扩展成具有唯一取值的整型常数表达式,可作为setlocale的第一个参数。NULL
:由实现环境定义的空指针。
struct lconv结构
该结构用于存储和表示当前locale的设置。其结构定义如下:
struct lconv
{
char*decimal_point ;
char*thousands_sep ;
char*grouping ;
char*int_curr_symbol ;
char*currency_symbol ;
char*mon_decimal_point ;
char*mon_thousands_sep ;
char*mon_grouping ;
char*positive_sign ;
char*negative_sign ;
char int_frac_digits ;
char frac_digits ;
char p_cs_precedes ;
char p_sep_by_space ;
char n_cs_precedes ;
char n_sep_by_space ;
char p_sign_posn ;
char n_sign_posn ;
};
函数
struct Iconv *localeconv(void);
函数localeconv将一个struct Iconv类型的对象的数据成员设置成为按照当前地域环境的有关规则进行数量格式化后的相应值。char *setlocale(int category,char * locale);
函数setlocale用于更改和查询程序的整个当前地域环境或部分设置。地域环境变量由参数category(上面定义的6个常量)和locale指定。
1.6 数学函数math.h
在math.h中定义了一些数学函数和宏,用来实现不同种类的数学运算。下面给出中标准数学函数的函数定义及功能简介,见下表。
函数定义 | 函数功能简介 |
---|---|
double exp(double x); | 指数运算函数, 求e的x次幂函数 |
double log(double x) | 对数函数ln(x) |
double log10(double x); | 对数函数log |
double pow(double x, double y); | 指数函数(x的y次方) |
double sqrt(double x); | 计算平方根函数 |
double ceil(double x); | 向上舍入函数 |
double floor(double x); | 向下舍入函数 |
double fabs(double x); | 求浮点数的绝对值 |
double ldexp(double x, int n); | 装载浮点数函数 |
double frexp(double x, int* exp); | 分解浮点数函数 |
double modf(double x, double* ip); | 分解双精度数函数 |
double fmod(double x, double y); | 求模函数 |
double sin(double x); | 计算x的正弦值函数 |
double cos(double x); | 计算x的余弦值函数 |
double tan(double x); | 计算x的正切值函数 |
double asin(double x); | 计算x的反正弦函数 |
double acos(double x); | 计算x的反余弦函数 |
double atan(double x); | 反正切函数1 |
double atan2(double y, double x); | 反正切函数2 |
double sinh(double x); | 计算x的双曲正弦值 |
double cosh(double x); | 计算x的双曲余弦值 |
double tanh(double x); | 计算x的双曲正切值 |
1.7 非局部跳转setjmp.h
在setjmp.h头文件中定义了一种特别的函数调用和函数返回顺序的方式。这种方式不同于以往的函数调用和返回顺序,它允许程序流程立即从一个深层嵌套的函数中返回。
定义了两个宏:int setjmp(jmp_buf env);
设置调转点
和 longjmp(jmp_buf jmpb, int retval);
跳转
宏setjmp的功能是将当前程序的状态保存在结构env,为调用宏longjmp设置一个跳转点。setjmp将当前信息保存在env中供longjmp使用。其中env是jmp_buf结构类型的,该结构定义为:
typedef struct {
unsigned j_sp;
unsigned j_ss;
unsigned j_flag;
unsigned j_cs;
unsigned j_ip;
unsigned j_bp;
unsigned j_di;
unsigned j_es;
unsigned j_si;
unsigned j_ds;
} jmp_buf[1];
直接调用setjmp时,返回值为0,这一般用于初始化(设置跳转点时)。以后再调用longjmp宏时用env变量进行跳转。程序会自动跳转到setjmp宏的返回语句处,此时setjmp的返回值为非0,由longjmp的第二个参数指定。 下面通过例子来理解中定义的这两个宏。 例程9-1 非局部跳转演示。
include <setjmp.h>
jmp_buf env; /*定义jmp_buf类型变量*/
int main(void)
{
int value;
value = setjmp(env); /*调用setjmp,为longjmp设置跳转点*/
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value); /*退出程序*/
}
printf("Jump ... \n");
longjmp(env,1); /*跳转到setjmp语句处*/
return 0;
}
本例先应用setjmp宏为longjmp设置跳转点,当第一次调用setjmp时返回值为0,并将程序的当前状态(寄存器的相关状态)保存在结构变量env中。当程序执行到longjmp时,系统会根据setjmp保存下来的状态env跳转到setjmp语句处,并根据longjmp的第二个参数设置此时setjmp的返回值。 本例的运行结果为:
Jump ...
Longjmp with value 1
一般地,宏setjmp和longjmp是成对使用的,这样程序流程可以从一个深层嵌套的函数中返回。
1.8 可变参数表stdarg.h
可变参数表中的宏是用来定义参数可变的函数的。在C语言中,有些库函数或者用户自定义的函数的参数是可变的,常用省略号“……”(例如库函数中的printf),定义这样的函数就要使用到中的宏。
va_list:用于保存宏va_start,va_arg以及va_end所需信息的数据类型。
stdarg.h中还定义了三个宏:
- void va_start(va_list ap, parmN);
- type va_arg(va_list ap,type);
- void va_end (va_list ap);
va_start的作用是初始化ap,因此va_start要在所有其它的va开头的宏前面最先使用(除了用va_list定义变量外),后面的va_copy, va_arg, va_end都要使用到ap。在一对va_start和va_end之间不能再次使用va_start宏。其中,parmN为"..."之前的最后一个参数。
例如,printf函数定义为:printf(const char format, ...); 那么在printf函数中的va_start使用之后, parmN 的值就等于format。
va_arg的作用就是返回参数列表ap中的下一个具有type类型的参数,每次调用va_arg都会修改ap的值,这样才能连续不断地获取下一个type类型的参数。 va_end与va_start构成了一个scope,va_end标志着结束,va_end之后ap就无效了。
1.9 公共定义stddef.h
在stddef.h头文件中,指定了标准库中的公共定义。其中主要包括以下内容:
NULL
:空指针类型常量。offset(type,member-designator)
:它是扩展iz-t类型的一个整型常数表达式。它的值为从type定义的结构类型的开头到结构成员member-designator的偏移字节数。ptrdiff_t
:表示两指针之差的带符号整数类型。size_t
:表示由sizeof运算符计算出的结果类型,它是一个无符号整数类型。wchar_t
:它是一种整数类型,取值范围为在被支持的地域环境中最大扩展字符集的所有字符的各种代码,空字符代码值为0。
1.10 输入输出stdio.h
在stdio.h头文件中定义了输入输出函数,类型和宏。这些函数、类型和宏几乎占到标准库的三分之一。 下面给出头文件中声明的函数以及功能简介,见下表。
函数定义 | 函数功能简介 |
---|---|
FILE *fopen(char *filename, char *type) | 打开一个文件 |
FILE *fropen(char *filename, char *type,FILE *fp) | 打开一个文件,并将该文件关联到fp指定的流 |
int fflush(FILE *stream) | 清除一个流 |
int fclose(FILE *stream) | 关闭一个文件 |
int remove(char *filename) | 删除一个文件 |
int rename(char *oldname, char *newname) | 重命名文件 |
FILE *tmpfile(void) | 以二进制方式打开暂存文件 |
char *tmpnam(char *sptr) | 创建一个唯一的文件名 |
int setvbuf(FILE *stream, char *buf, int type, unsigned size) | 把缓冲区与流相关 |
int printf(char *format...) | 产生格式化输出的函数 |
int fprintf(FILE *stream, char *format[, argument,...]) | 传送格式化输出到一个流中 |
int scanf(char *format[,argument,...]) | 执行格式化输入 |
int fscanf(FILE *stream, char *format[,argument...]) | 从一个流中执行格式化输入 |
int fgetc(FILE *stream) | 从流中读取字符 |
char *fgets(char *string, int n, FILE *stream) | 从流中读取一字符串 |
int fputc(int ch, FILE *stream) | 送一个字符到一个流中 |
int fputs(char *string, FILE *stream) | 送一个字符到一个流中 |
int getc(FILE *stream) | 从流中取字符 |
int getchar(void) | 从stdin流中读字符 |
char *gets(char *string) | 从流中取一字符串 |
int putchar(int ch) | 在stdout上输出字符 |
int puts(char *string) | 送一字符串到流中 |
int ungetc(char c, FILE *stream) | 把一个字符退回到输入流中 |
int fread(void *ptr, int size, int nitems, FILE *stream) | 从一个流中读数据 |
int fwrite(void *ptr, int size, int nitems, FILE *stream) | 写内容到流中 |
int fseek(FILE *stream, long offset, int fromwhere) | 重定位流上的文件指针 |
long ftell(FILE *stream) | 返回当前文件指针 |
int rewind(FILE *stream) | 将文件指针重新指向一个流的开头 |
int fgetpos(FILE *stream) | 取得当前文件的句柄 |
int fsetpos(FILE *stream, const fpos_t *pos) | 定位流上的文件指针 |
void clearerr(FILE *stream) | 复位错误标志 |
int feof(FILE *stream) | 检测流上的文件结束符 |
int ferror(FILE *stream) | 检测流上的错误 |
void perror(char *string) | 系统错误信息 |
1.11 实用函数stdlib.h
在stdlib.h头文件中声明了一些实现数值转换,内存分配等类似功能的函数。下面给出头文件中声明的函数以及功能简介,见下表。
函数定义 | 函数功能简介 |
---|---|
double atof(const char *s) | 将字符串s转换为double类型 |
int atoi(const char *s) | 将字符串s转换为int类型 |
long atol(const char *s) | 将字符串s转换为long类型 |
double strtod (const char*s,char **endp) | 将字符串s前缀转换为double型 |
long strtol(const char*s,char **endp,int base) | 将字符串s前缀转换为long型 |
unsinged long strtol(const char*s,char **endp,int base) | 将字符串s前缀转换为unsinged long型 |
int rand(void) | 产生一个0~RAND_MAX之间的伪随机数 |
void srand(unsigned int seed) | 初始化随机数发生器 |
void *calloc(size_t nelem, size_t elsize) | 分配主存储器 |
void *malloc(unsigned size) | 内存分配函数 |
void *realloc(void *ptr, unsigned newsize) | 重新分配主存 |
void free(void *ptr) | 释放已分配的块 |
void abort(void) | 异常终止一个进程 |
void exit(int status) | 终止应用程序 |
int atexit(atexit_t func) | 注册终止函数 |
char *getenv(char *envvar) | 从环境中取字符串 |
void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(fcmp)(const void *, const *)) | 二分法搜索函数 |
void qsort(void base, int nelem, int width, int (fcmp)()) | 使用快速排序例程进行排序 |
int abs(int i) | 求整数的绝对值 |
long labs(long n) | 取长整型绝对值 |
div_t div(int number, int denom) | 将两个整数相除, 返回商和余数 |
ldiv_t ldiv(long lnumer, long ldenom) | 两个长整型数相除, 返回商和余数 |
1.12 日期与时间函数time.h
在time.h头文件中,声明了一些处理日期和时间的类型与函数。clock_t
和time_t
是两个表示时间值的算术类型。结构struct tm
存储了一个日历时间的各个成分。结构tm的成员的意义及其正常的取值范围如下:
struct tm {
int tm_sec; /*从当前分钟开始经过的秒数(0,61)*/
int tm_min; /*从当前小时开始经过的分钟数(0,59)*/
int tm_hour; /*从午夜开始经过的小时数(0,23)*/
int tm_mday; /*当月的天数(1,31)*/
int tm_mon; /*从1月起经过的月数(0,11)*/
int tm_year; /*从1900年起经过的年数*/
int tm_wday; /*从本周星期天开始经过的天数(0,6)*/
int tm_yday; /*从今年1月1日起经过的天数(0,356)*/
int tm_isdst; /*夏令时标记*/
};
如果夏令时有效,夏令时标记tm_isdst值为正;若夏令时无效,tm_isdst值为0;如果得不到夏令时信息,tm_isdst值为负。 下面给出头文件中声明的时间函数,见下表。
函数定义 | 函数功能简介 |
---|---|
clock_t clock(void) | 确定处理器时间函数 |
time_t time(time_t *tp) | 返回当前日历时间 |
double difftime(time_t time2, time_t time1) | 计算两个时刻之间的时间差 |
time_t mktime(struct tm *tp) | 将分段时间值转换为日历时间值 |
char *asctime(const struct tm *tblock) | 转换日期和时间为ASCII码 |
char *ctime(const time_t *time) | 把日期和时间转换为字符串 |
struct tm *gmtime(const time_t *timer) | 把日期和时间转换为格林尼治标准时间(GMT) |
struct tm *localtime(const time_t *timer) | 把日期和时间转变为结构 |
size_t strftime(char *s,size_t smax,const char *fmt, const struct tm *tp) | 根据fmt的格式要求将*tp中的日期与时间转换为指定格式。 |
1.13 信号signal.h
头signal.h文件中提供了一些处理程序运行期间引发的各种异常条件的功能,例如一些来自外部的中断信号等。 在中只定义了两个函数:int signal(int sig, sigfun fname);
和int raise(int sig);
signal
函数的作用是设置某一信号的对应动作。其中参数sig用来指定哪一个信号被设置处理函数。
在标准C 中支持的信号如下表。 标准C支持的信号
取值 | 说明 | 默认执行动作 | 使用的操作系统 |
---|---|---|---|
SIGABRT | 异常中止 | 中止程序 | UNIX DOS |
SIGPPE | 算术运算错误 | 中止程序 | UNIX DOS |
SIGILL | 非法硬件指令 | 中止程序 | UNIX DOS |
SIGINT | 终端中断 | 中止程序 | UNIX DOS |
SIGSEGV | 无效的内存访问 | 中止程序 | UNIX DOS |
SIGTERM | 中止信号 | 中止程序 | UNIX DOS |
参数fname是一个指向函数的指针,当sig的信号发生时程序会自动中断转而执行fname指向的函数。执行完毕再返回断点继续执行程序。系统提供了两个常量函数指针,可以作为函数的参数传递。它们分别是:
SIG_DEF
:执行默认的系统第一的函数。SIG_IGN
:忽略此信号。
raise函数的作用是向正在执行的程序发送一个信号,从而使得当前进程产生一个中断而转向信号处理函数signal执行。其中参数sig为信号名称,它的取值范围同函数signal中的参数sig取值范围相同 ,下面通过例子理解函数signal和raise。
#include <stdio.h>
#include <signal.h>
void Print1();
void Print2();
int main()
{ signal(SIGINT,Print1);
printf("Please enter Ctr+c for interupt\n") ;
getchar();
signal(SIGSEGV,Print2);
printf("Please enter any key for a interupt\n");
getchar();
raise(SIGSEGV);
}
void Print1()
{
printf("This is a SIGINT interupt!\n");
}
void Print2()
{
printf("This is a SIGSEGV interupt!\n");
}
本例首先通过用户终端输入Ctrl+c产生一个终端中断,然后应用signal函数调用中断处理函数Print1;再通过raise函数生成一个无效内存访问中断,并通过signal函数调用中断处理函数Print2。
运行结果为:
标签:va,常用,函数,int,double,void,介绍,C语言,char From: https://www.cnblogs.com/jingzh/p/18263484Please enter Ctr+c for interupt
^C
This is a SIGINT interupt!
Please enter any key for a interupt
a
This is a SIGSEGV interupt!