c语言头文件
ctype.h
字符处理函数: 本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换
----------------------------------------
字符测试是否字母和数字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否数字 isdigit
是否可显示字符(除空格外) isgraph
是否可显示字符(包括空格) isprint
是否既不是空格,又不是字母和数字的可显示字符 ispunct
是否空格 isspace
是否大写字母 isupper
是否16进制数字(0,9,A-F)字符 isxdigit
字符大小写转换函数 转换为大写字母 toupper
转换为小写字母 tolower
头文件 local.h
地区化: 本类别的函数用于处理不同国家的语言差异。
----------------------------------------
地区控制 地区设置 setlocale
数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv
头文件 math.h
数学函数: 本分类给出了各种数学计算函数,必须提醒的是ANSI
C
中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)
----------------------------------------
反余弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
双曲余弦 cosh
双曲正弦 sinh
双曲正切 tanh
指数函数 exp
指数分解函数 frexp
1
乘积指数函数 fdexp
自然对数 log
以10为底的对数 log10
浮点数分解函数 modf
幂函数 pow
平方根函数 sqrt
求下限接近整数 ceil
绝对值 fabs
求上限接近整数 floor
求余数 fmod
头文件 setjmp.h io.h
本分类函数用于实现在不同底函数之间直接跳转代码。
----------------------------------------
保存调用环境 setjmp
恢复调用环境 longjmp
头文件 signal.h
信号处理: 该分类函数用于处理那些在程序执行过程中发生例外的情况。
----------------------------------------
指定信号处理函数 signal
发送信号 raise
头文件 stdarg.h
可变参数处理: 本类函数用于实现诸如printf,scanf等参数数量可变底函数。
----------------------------------------
可变参数访问宏
可变参数开始宏 va_start
可变参数结束宏 va_end
可变参数访问宏 访问下一个可变参数宏 va_arg
头文件 stdio.h
输入输出函数:该分类用于处理包括文件、控制台等各种输入输出设备,各种函数以“流”的方式实现
----------------------------------------
删除文件 remove
修改文件名称 rename
生成临时文件名称 tmpfile
得到临时文件路径 tmpnam
文件访问 关闭文件 fclose
刷新缓冲区 fflush
2
打开文件 fopen
将已存在的流指针和新文件连接 freopen
设置磁盘缓冲区 setbuf
设置磁盘缓冲区 setvbuf
格式化输入与输出函数
格式输出 fprintf
格式输入 fscanf
格式输出(控制台) printf
格式输入(控制台) scanf
格式输出到缓冲区 sprintf
从缓冲区中按格式输入 sscanf
格式化输出 vfprintf
格式化输出 vprintf
格式化输出 vsprintf
字符输入输出函数
输入一个字符 fgetc
字符串输入 fgets
字符输出 fputc
字符串输出 fputs
字符输入(控制台) getc
字符输入(控制台) getchar
字符串输入(控制台) gets
字符输出(控制台) putc
字符输出(控制台) putchar
字符串输出(控制台) puts
字符输出到流的头部 ungetc
直接输入输出
直接流读操作 fread
直接流写操作 fwrite
文件定位函数
得到文件位置 fgetpos
文件位置移动 fseek
文件位置设置 fsetpos
得到文件位置 ftell
文件位置复零位 remind
错误处理函数
错误清除 clearerr
文件结尾判断 feof
文件错误检测 ferror
得到错误提示字符串 perror
3
头文件 stdlib.h
实用工具函数: 本分类给出了一些函数无法按以上分类,但又是编程所必须要的。
----------------------------------------
字符串转换函数
字符串转换为整数 atoi
字符串转换为长整数 atol
字符串转换为浮点数 strtod
字符串转换为长整数 strtol
字符串转换为无符号长整型 strtoul
伪随机序列产生函数
产生随机数 rand
设置随机函数的起动数值 srand
存储管理函数
分配存储器 calloc
释放存储器 free
存储器分配 malloc
重新分配存储器 realloc
环境通信
中止程序 abort
退出程序执行,并清除环境变量 atexit
退出程序执行 exit
读取环境参数 getenv
程序挂起,临时执行一个其他程序 system
搜索和排序工具 二分查找(数据必须已排序) bsearch
快速排序 qsort
整数运算函数 求绝对值 abs
得到除法运算底商和余数 div
求长整形底绝对值 labs
求长整形除法的商和余数 ldiv
多字节字符函数 得到多字节字符的字节数 mblen
得到多字节字符的字节数 mbtowc
多字节字符转换 wctomb
多字节字符的字符串操作 将多字节串转换为整数数组 mbstowcs
将多字节串转换为字符数组 mcstowbs
头文件 string.h
字符串处理: 本分类的函数用于对字符串进行合并、比较等操作
----------------------------------------
字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy
块拷贝(目的和源存储区可重叠) memmove
串拷贝 strcpy
4
按长度的串拷贝 strncpy
字符串连接函数 串连接 strcat
按长度连接字符串 strncat
串比较函数 块比较 memcmp
字符串比较 strcmp
字符串比较(用于非英文字符) strcoll
按长度对字符串比较 strncmp
字符串转换 strxfrm
字符与字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
杂类函数 字符串设置 memset
错误字符串映射 strerror
求字符串长度 strlen
头文件 time.h
日期和时间函数: 本类别给出时间和日期处理函数
----------------------------------------
时间操作函数得到处理器时间 clock
得到时间差 difftime
设置时间 mktime
得到时间 time
时间转换函数 得到以ASCII码表示的时间 asctime
得到字符串表示的时间 ctime
得到指定格式的时间 strftime
序号 库类别 头文件
----------------------------------------
1 错误处理 errno.h
2 字符处理 ctype.h
3 地区化 local.h
4 数学函数 math.h
5 信号处理 signal.h
6 输入输出 stdio.h
7 实用工具程序 stdlib.h
8 字符串处理 string.h
5
字符处理函数
本类别函数用于对单个字符进行处理,包括字符的类别测试和字符的大小写转换
头文件 ctype.h
函数列表<>
函数类别 函数用途 详细说明
字符测试 是否字母和数字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否数字 isdigit
是否可显示字符(除空格外) isgraph
是否可显示字符(包括空格) isprint
是否既不是空格,又不是字母和数字的可显示字符 ispunct 是否空格 isspace
是否大写字母 isupper
是否16进制数字(0,9,A-F)字符 isxdigit 字符大小写转换函数 转换为大写字母 toupper 转换为小写字母 tolower
地区化
本类别的函数用于处理不同国家的语言差异。
头文件 local.h
函数列表
函数类别 函数用途 详细说明
地区控制 地区设置 setlocale
数字格式约定查询 国家的货币、日期、时间等的格式转换 localeconv
数学函数
本分类给出了各种数学计算函数,必须提醒的是ANSI C标准中的数据格式并不符合IEEE754标准,一些C语言编译器却遵循IEEE754(例如frinklin C51)
头文件 math.h
函数列表
函数类别 函数用途 详细说明
错误条件处理 定义域错误(函数的输入参数值不在规定的范围内) 值域错误(函数的返回值不在规定的范围内)
三角函数 反余弦 acos
反正弦 asin
6
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
双曲函数 双曲余弦 cosh 双曲正弦 sinh
双曲正切 tanh
指数和对数 指数函数 exp 指数分解函数 frexp 乘积指数函数 fdexp 自然对数 log
以10为底的对数 log10 浮点数分解函数 modf 幂函数 幂函数 pow
平方根函数 sqrt
整数截断,绝对值和求余数函数 求下限接近整数 ceil
绝对值 fabs
求上限接近整数 floor 求余数 fmod
本分类函数用于实现在不同底函数之间直接跳转代码。 头文件 setjmp.h io.h
函数列表
函数类别 函数用途 详细说明 保存调用环境 setjmp 恢复调用环境 longjmp
信号处理
该分类函数用于处理那些在程序执行过程中发生例外的情况。
头文件 signal.h
函数列表
函数类别 函数用途 详细说明 指定信号处理函数 signal 发送信号 raise
可变参数处理
本类函数用于实现诸如printf,scanf等参数数量可变底函数。
7
头文件 stdarg.h
函数列表
函数类别 函数用途 详细说明
可变参数访问宏 可变参数开始宏 va_start 可变参数结束宏 va_end
可变参数访问宏 访问下一个可变参数宏 va_arg
输入输出函数
该分类用于处理包括文件、控制台等各种输入输出设备,各种函数以“流”的方式实现
头文件 stdio.h
函数列表
函数类别 函数用途 详细说明
文件操作
删除文件 remove
修改文件名称 rename
生成临时文件名称 tmpfile 得到临时文件路径 tmpnam
文件访问 关闭文件 fclose
刷新缓冲区 fflush
打开文件 fopen
将已存在的流指针和新文件连接 freopen 设置磁盘缓冲区 setbuf
设置磁盘缓冲区 setvbuf
格式化输入与输出函数 格式输出 fprintf 格式输入 fscanf
格式输出(控制台) printf 格式输入(控制台) scanf
格式输出到缓冲区 sprintf 从缓冲区中按格式输入 sscanf 格式化输出 vfprintf
格式化输出 vprintf
格式化输出 vsprintf
字符输入输出函数 输入一个字符 fgetc 字符串输入 fgets
字符输出 fputc
字符串输出 fputs
字符输入(控制台) getc
字符输入(控制台) getchar 字符串输入(控制台) gets
8
字符输出(控制台) putc
字符输出(控制台) putchar 字符串输出(控制台) puts
字符输出到流的头部 ungetc 直接输入输出 直接流读操作 fread 直接流写操作 fwrite
文件定位函数 得到文件位置 fgetpos 文件位置移动 fseek
文件位置设置 fsetpos
得到文件位置 ftell
文件位置复零位 remind
错误处理函数 错误清除 clearerr 文件结尾判断 feof
文件错误检测 ferror
得到错误提示字符串 perror
实用工具函数
本分类给出了一些函数无法按以上分类,但又是编程所必须要的。
头文件 stdlib.h
函数列表
函数类别 函数用途 详细说明
字符串转换函数 字符串转换为整数 atoi 字符串转换为长整数 atol
字符串转换为浮点数 strtod 字符串转换为长整数 strtol 字符串转换为无符号长整型 strtoul 伪随机序列产生函数 产生随机数 rand 设置随机函数的起动数值 srand 存储管理函数 分配存储器 calloc 释放存储器 free
存储器分配 malloc
重新分配存储器 realloc
环境通信 中止程序 abort
退出程序执行,并清除环境变量 atexit 退出程序执行 exit
读取环境参数 getenv
程序挂起,临时执行一个其他程序 system 搜索和排序工具 二分查找(数据必须已排序) bsearch
快速排序 qsort
整数运算函数 求绝对值 abs
9
div
得到除法运算底商和余数
求长整形底绝对值 labs
求长整形除法的商和余数 ldiv
多字节字符函数 得到多字节字符的字节数 mblen 得到多字节字符的字节数 mbtowc 多字节字符转换 wctomb
多字节字符的字符串操作 将多字节串转换为整数数组 mbstowcs
将多字节串转换为字符数组 mcstowbs
字符串处理
本分类的函数用于对字符串进行合并、比较等操作
头文件 string.h
函数列表
函数类别 函数用途 详细说明
字符串拷贝 块拷贝(目的和源存储区不可重叠) memcpy
块拷贝(目的和源存储区可重叠) memmove 串拷贝 strcpy
按长度的串拷贝 strncpy
字符串连接函数 串连接 strcat 按长度连接字符串 strncat
串比较函数 块比较 memcmp
字符串比较 strcmp
字符串比较(用于非英文字符) strcoll 按长度对字符串比较 strncmp
字符串转换 strxfrm
字符与字符串查找 字符查找 memchr 字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
杂类函数 字符串设置 memset
错误字符串映射 strerror
求字符串长度 strlen
日期和时间函数
本类别给出时间和日期处理函数
10
头文件 time.h
函数列表
函数类别 函数用途 详细说明
时间操作函数 得到处理器时间 clock
得到时间差 difftime
设置时间 mktime
得到时间 time
时间转换函数 得到以ASCII码表示的时间 asctime
得到字符串表示的时间 ctime
得到指定格式的时间 strftime
函数库未来的发展方向
本部分用于说明各类别函数库在将来如何发展。
序号 库类别 头文件 详细说明
1 错误处理 errno.h
2 字符处理 ctype.h
3 地区化 local.h
4 数学函数 math.h
5 信号处理 signal.h
6 输入输出 stdio.h
7 实用工具程序 stdlib.h
8 字符串处理 string.h
13.2 个人库:头文件
前面已经介绍了C语言标准库的存在如何简化了程序开发。然而,标准库还没有广泛到可以处理每个编程需要。自己编写的函数可能经常会在一个不同于最初编写环境的上下文环境中应用。将函数代码复制到其他程序中就可以进行重用,但是也有些不便,尤其是在与访问标准库的方法进行比较后。事实上,可以使用C语言预处理指令#include使得个人库也成为可利用的库。由于C语言允许将源代码文件分别编译,然后在加载和执行之前进行链接,所以可以将个人库作为目标文件提供;使用个人库的程序不需要先编译其中的函数。如果再看一下最初在第1章给出的框图,也就是在图13-1中重新给出的图,就能够更好地理
11
解灰色的矩形和箭头。到目前为止,链接到代码中的“其他目标文件”一直是标准的C语言库。在我们学习了产生自己的库文件后,这些文件也可以作为准备运行程序的一部分提供给链接器。
图13-1 准备运行程序
13.2.1 头文件
产生个人库必须首先产生头文件——包含关于一个库的所有信息的文本文件,该库是编译器在编译一个使用库中定义内容的程序时需要的。确切地说,这类信息可以在像stdio.h、math.h和string.h这样的系统头文件中找到。我们推荐的头文件形式也提供了所有的库用户需要的信息。头文件的常见内容包括
(1) 总结库效用的块注释。
12
(2) #define指令命名常量宏。
(3) 类型定义。
(4) 说明每个库函数目的的块注释和如下形式的声明:
extern prototype
头文件(header file) 包含库的接口信息的文本文件,编译器用它翻译使用该库的程序系统,或让用户了解并使用该库。
在函数声明中使用关键字extern是通知编译器该函数的定义会提供给链接器。图13-2给出了第11章中的行星数据类型和运算符的头文件。在图13-3中可以看到一个源文件的开头,该源文件需要该库的软件功能。这里假定头文件命名为planet.h,并且它位于的目录是预处理器首先在其中寻找文件的目录,这些文件名出现在#include后的引号内。这个问题依赖于系统的不同而不同,但是在许多情况下,首先查找的目录就是当前源文件所在的目录。 565. /* planet.h
566. *
567. * abstract data type planet
568. *
569. * Type planet_t has these components:
570. * name, diameter, moons, orbit_time, rotation_time
571. *
572. * Operators:
573. * print_planet, planet_equal, scan_planet
574. */
575.
576. #define PLANET_STRSIZ 10
577.
578. typedef struct { /* planet structure */
579. char name[PLANET_STRSIZ];
580. double diameter; /* equatorial diameter in km */ 581. int moons; /* number of moons */
582. double orbit_time, /* years to orbit sun once */ 583. rotation_time; /* hours to complete one revolution on 584. axis */
585. } planet_t;
586.
587. /*
13
588. * Displays with labels all components of a planet_t structure
589. */
590. extern void
591. print_planet(planet_t pl); /* input - one planet structure */
592.
593. /*
594. * Determines whether or not the components of planet_1 and planet_2
595. * match
596. */
图13-2 个人库的拥有数据类型和相关函数的头文件planet.h
597. extern int
598. planet_equal(planet_t planet_1, /* input - planets to */
599. planet_t planet_2); /* compare */
600.
601. /*
602. * Fills a type planet_t structure with input data. Integer returned as
603. * function result is success/failure/EOF indicator.
604. * 1 => successful input of planet
605. * 0 => error encountered
606. * EOF => insufficient data before end of file
607. * In case of error or EOF, value of type planet_t output argument is
608. * undefined.
609. */
610. extern int
611. scan_planet(planet_t *plnp); /* output - address of planet_t structure to fill */
图13-2(续)
612. /*
613. * Beginning of source file in which a personal library and system I/O library 614. * are used.
615. */
616.
617. #include
/* system's standard I/O
functions */
618.
619. #include "planet.h" /* personal library with planet_t data type and 620. operators */
621. . . .
图13-3 使用个人库内函数的程序片段
14
到目前为止的程序中已经使用过尖括号(< >),就像
#include
是告诉预处理器头文件可以在系统目录中找到。将头文件名用引号括起,就像 #include "planet.h"
是将它标记为有关属于编程者的库的信息。
在修改源文件时,C预处理器将每个#include行替换为它所指的头文件内容。
在第3章和第6章中首次接触用户定义的函数时,已经强调了在函数开头放置的块注释的重要性以及函数原型和函数参数注释的重要性。在这些信息都获得后,该原型及其相关注释就给想要调用该函数的编程者提供了所需的基本信息:该函数是做什么的、它返回什么类型的值(若有的话),以及它操作什么类型的参数。需要注意的是,这恰好就是放置在头文件中的信息。
将任何问题划分为可处理问题块的一个重要方面就是定义端点,在端点处的解决块合起来就形成了完整的解决方案。在解决方案的两个分离部分之间的公共边界称为接口。头文件的目的是定义库和任何使用该库的程序之间的接口。 13.2.2 头文件设计的忠告
在上面的头文件例子中会发现:定义的常量宏(PLANET_STRSIZ)拥有一个较长的以库名开始的名称。这样的命名规则减小了头文件中与常量相关的名称和程序中另外的常量宏名发生冲突的可能性。
在13.3节中会介绍如何产生个人库的一个实现文件。头(接口)文件和实现文件是个人库中的两个基本的源文件。
练习
自测
1. C预处理器如何确定#include语句中的头文件名是系统库名还是个人库
名,
2. 函数的 和相关的 是编程者为了使用该函数所必
须了解的有关该函数信息的集合。
15
3. 头(接口)文件描述了库函数做 ,而不是它们
完成。
编程
1. 查看第3章的数学库函数表格(表3-1)。定义头文件myops.h,它包含
了函数fabs、sqrt和pow的接口的完整说明。然后在该文件中加入有关f
actorial函数的信息(见第5章)。有关于factorial的接口信息的哪些
事情需要函数的实现进行循环,哪些事情需要该实现进行递归,
16