C 语言常用的库函数
库函数并不是 C 语言的一部分,它是由编译系统根据一般用户的需要编制并提供给用户使用的一组程序。每一种 C 编译系统都提供了一批库函数,不同的编译系统所提供的库函数的数目和函数名以及函数功能是不完全相同的。 ANSI C 标准提出了一批建议提供的标准库函数。它包括了目前多数 C 编译系统所提供的库函数,但也有一些是某些 C 编译系统未曾实现的。考虑到通用性,本附录列出 ANSI C 建议的常用库函数。
由于 C 库函数的种类和数目很多,例如还有屏幕和图形函数、时间日期函数、与系统有关的函数等,每一类函数又包括各种功能的函数,限于篇幅,本附录不能全部介绍,只从教学需要的角度列出最基本的。读者在编写 C 程序时可根据需要,查阅有关系统的函数使用手册。
1.数学函数
使用数学函数时,应该在源文件中使用预编译命令:
#include <math.h> 或 #include “math.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
acos | double acos(double x); | 计算 arccos x 的值,其中 -1<=x<=1 | 计算结果 |
asin | double asin(double x); | 计算 arcsin x 的值,其中 -1<=x<=1 | 计算结果 |
atan | double atan(double x); | 计算 arctan x 的值 | 计算结果 |
atan2 | double atan2(double x, double y); | 计算 arctan x/y 的值 | 计算结果 |
cos | double cos(double x); | 计算 cos x 的值,其中 x 的单位为弧度 | 计算结果 |
cosh | double cosh(double x); | 计算 x 的双曲余弦 cosh x 的值 | 计算结果 |
exp | double exp(double x); | 求 e x 的值 | 计算结果 |
fabs | double fabs(double x); | 求 x 的绝对值 | 计算结果 |
floor | double floor(double x); | 求出不大于 x 的最大整数 | 该整数的双精度实数 |
fmod | double fmod(double x, double y); | 求整除 x/y 的余数 | 返回余数的双精度实数 |
frexp | double frexp(double val, int *eptr); | 把双精度数 val 分解成数字部分 ( 尾数 ) 和以 2 为底的指数,即 val=x*2 n ,n 存放在 eptr 指向的变量中 | 数字部分 x0.5<=x<1 |
log | double log(double x); | 求 lnx 的值 | 计算结果 |
log10 | double log10(double x); | 求 log 10 x 的值 | 计算结果 |
modf | double modf(double val, int *iptr); | 把双精度数 val 分解成数字部分和小数部分,把整数部分存放在 ptr 指向的变量中 | val 的小数部分 |
pow | double pow(double x, double y); | 求 x y 的值 | 计算结果 |
sin | double sin(double x); | 求 sin x 的值,其中 x 的单位为弧度 | 计算结果 |
sinh | double sinh(double x); | 计算 x 的双曲正弦函数 sinh x 的值 | 计算结果 |
sqrt | double sqrt (double x); | 计算 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LDWMhivL-1590681770601)(F:%5C%E6%88%91%E7%9A%84%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F%5CTypora%E7%AC%94%E8%AE%B0%E4%B8%93%E5%8C%BA%5Cimage%5Cwps1-1590681577557.png)],其中 x ≥ 0 | 计算结果 |
tan | double tan(double x); | 计算 tan x 的值,其中 x 的单位为弧度 | 计算结果 |
tanh | double tanh(double x); | 计算 x 的双曲正切函数 tanh x 的值 | 计算结果 |
2 .字符函数
在使用字符函数时,应该在源文件中使用预编译命令:
#include <ctype.h> 或 #include “ctype.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
isalnum | int isalnum(int ch); | 检查 ch 是否字母或数字 | 是字母或数字返回 1 ,否则返回 0 |
isalpha | int isalpha(int ch); | 检查 ch 是否字母 | 是字母返回 1 ,否则返回 0 |
iscntrl | int iscntrl(int ch); | 检查 ch 是否控制字符 ( 其 ASCII 码在 0 和 0xlF 之间 ) | 是控制字符返回 1 ,否则返回 0 |
isdigit | int isdigit(int ch); | 检查 ch 是否数字 | 是数字返回 1 ,否则返回 0 |
isgraph | int isgraph(int ch); | 检查 ch 是否是可打印字符 ( 其 ASCII 码在 0x21 和 0x7e 之间 ) ,不包括空格 | 是可打印字符返回 1 ,否则返回 0 |
islower | int islower(int ch); | 检查 ch 是否是小写字母 (a ~ z) | 是小字母返回 1 ,否则返回 0 |
isprint | int isprint(int ch); | 检查 ch 是否是可打印字符 ( 其 ASCII 码在 0x21 和 0x7e 之间 ) ,不包括空格 | 是可打印字符返回 1 ,否则返回 0 |
ispunct | int ispunct(int ch); | 检查 ch 是否是标点字符 ( 不包括空格 ) 即除字母、数字和空格以外的所有可打印字符 | 是标点返回 1 ,否则返回 0 |
isspace | int isspace(int ch); | 检查 ch 是否空格、跳格符 ( 制表符 ) 或换行符 | 是,返回 1 ,否则返回 0 |
isupper | int isupper(int ch); | 检查 ch 是否大写字母 (A ~ Z) | 是大写字母返回 1 ,否则返回 0 |
isxdigit | int isxdigit(int ch); | 检查 ch 是否一个 16 进制数字( 即 0 ~ 9 ,或 A 到 F , a ~ f) | 是,返回 1 ,否则返回 0 |
tolower | int tolower(int ch); | 将 ch 字符转换为小写字母 | 返回 ch 对应的小写字母 |
toupper | int toupper(int ch); | 将 ch 字符转换为大写字母 | 返回 ch 对应的大写字母 |
3 .字符串函数
使用字符串中函数时,应该在源文件中使用预编译命令:
#include <string.h> 或 #include “string.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
memchr | void memchr(void *buf, char ch, unsigned count); | 在 buf 的前 count 个字符里搜索字符 ch 首次出现的位置 | 返回指向 buf 中 ch 的第一次出现的位置指针。若没有找到 ch ,返回 NULL |
memcmp | int memcmp(void *buf1, void *buf2, unsigned count); | 按字典顺序比较由 buf1 和 buf2 指向的数组的前 count 个字符 | buf1<buf2 ,为负数buf1=buf2 ,返回 0buf1>buf2 ,为正数 |
memcpy | void *memcpy(void *to, void *from, unsigned count); | 将 from 指向的数组中的前 count 个字符拷贝到 to 指向的数组中。 From 和 to 指向的数组不允许重叠 | 返回指向 to 的指针 |
memove | void *memove(void *to, void *from, unsigned count); | 将 from 指向的数组中的前 count 个字符拷贝到 to 指向的数组中。 From 和 to 指向的数组不允许重叠 | 返回指向 to 的指针 |
memset | void *memset(void *buf, char ch, unsigned count); | 将字符 ch 拷贝到 buf 指向的数组前 count 个字符中。 | 返回 buf |
strcat | char *strcat(char *str1, char *str2); | 把字符 str2 接到 str1 后面,取消原来 str1 最后面的串结束符 “\0” | 返回 str1 |
strchr | char *strchr(char *str,int ch); | 找出 str 指向的字符串中第一次出现字符 ch 的位置 | 返回指向该位置的指针,如找不到,则应返回 NULL |
strcmp | int *strcmp(char *str1, char *str2); | 比较字符串 str1 和 str2 | 若 str1<str2 ,为负数若 str1=str2 ,返回 0若 str1>str2 ,为正数 |
strcpy | char *strcpy(char *str1, char *str2); | 把 str2 指向的字符串拷贝到 str1 中去 | 返回 str1 |
strlen | unsigned intstrlen(char *str); | 统计字符串 str 中字符的个数 ( 不包括终止符 “\0”) | 返回字符个数 |
strncat | char *strncat(char *str1, char *str2, unsigned count); | 把字符串 str2 指向的字符串中最多 count 个字符连到串 str1 后面,并以 NULL 结尾 | 返回 str1 |
strncmp | int strncmp(char *str1,*str2, unsigned count); | 比较字符串 str1 和 str2 中至多前 count 个字符 | 若 str1<str2 ,为负数若 str1=str2 ,返回 0若 str1>str2 ,为正数 |
strncpy | char *strncpy(char *str1,*str2, unsigned count); | 把 str2 指向的字符串中最多前 count 个字符拷贝到串 str1 中去 | 返回 str1 |
strnset | void *setnset(char *buf, char ch, unsigned count); | 将字符 ch 拷贝到 buf 指向的数组前 count 个字符中。 | 返回 buf |
strset | void *setset(void *buf, char ch); | 将 buf 所指向的字符串中的全部字符都变为字符 ch | 返回 buf |
strstr | char *strstr(char *str1,*str2); | 寻找 str2 指向的字符串在 str1 指向的字符串中首次出现的位置 | 返回 str2 指向的字符串首次出向的地址。否则返回 NULL |
4 .输入输出函数
在使用输入输出函数时,应该在源文件中使用预编译命令:
#include <stdio.h> 或 #include “stdio.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
clearerr | void clearer(FILE *fp); | 清除文件指针错误指示器 | 无 |
close | int close(int fp); | 关闭文件 ( 非 ANSI 标准 ) | 关闭成功返回 0 ,不成功返回 -1 |
creat | int creat( char * filename, int mode); | 以 mode 所指定的方式建立文件 ( 非 ANSI 标准 ) | 成功返回正数,否则返回 -1 |
eof | int eof(int fp); | 判断 fp 所指的文件是否结束 | 文件结束返回 1 ,否则返回 0 |
fclose | int fclose(FILE *fp); | 关闭 fp 所指的文件,释放文件缓冲区 | 关闭成功返回 0 ,不成功返回非 0 |
feof | int feof(FILE *fp); | 检查文件是否结束 | 文件结束返回非 0 ,否则返回 0 |
ferror | int ferror(FILE *fp); | 测试 fp 所指的文件是否有错误 | 无错返回 0 ,否则返回非 0 |
fflush | int fflush(FILE *fp); | 将 fp 所指的文件的全部控制信息和数据存盘 | 存盘正确返回 0 ,否则返回非 0 |
fgets | char *fgets(char *buf, int n, FILE *fp); | 从 fp 所指的文件读取一个长度为 (n-1) 的字符串,存入起始地址为 buf 的空间 | 返回地址 buf 。若遇文件结束或出错则返回 EOF |
fgetc | int fgetc( FILE *fp ); | 从 fp 所指的文件中取得下一个字符 | 返回所得到的字符。出错返回 EOF |
fopen | FILE *fopen(char *filename, char *mode); | 以 mode 指定的方式打开名为 filename 的文件 | 成功,则返回一个文件指针,否则返回 0 |
fprintf | int fprintf(FILE *fp, char *format,args, … ); | 把 args 的值以 format 指定的格式输出到 fp 所指的文件中 | 实际输出的字符数 |
fputc | int fputc( char ch, FILE * fp); | 将字符 ch 输出到 fp 所指的文件中 | 成功则返回该字符,出错返回 EOF |
fputs | int fputs( char str, FILE * fp); | 将 str 指定的字符串输出到 fp 所指的文件中 | 成功则返回 0 ,出错返回 EOF |
fread | int fread(char *pt, unsigned size, unsigned n, FILE *fp); | 从 fp 所指定文件中读取长度为 size 的 n 个数据项,存到 pt 所指向的内存区 | 返回所读的数据项个数,若文件结束或出错返回 0 |
fscanf | int fscanf(FILE *fp, char *format,args, … ); | 从 fp 指定的文件中按给定的 format 格式将读入的数据送到 args 所指向的内存变量中 (args 是指针 ) | 以输入的数据个数 |
fseek | int fseek(FILE *fp, long offset, int base); | 将 fp 指定的文件的位置指针移到 base 所指出的位置为基准、以 offset 为位移量的位置 | 返回当前位置,否则返回 -1 |
ftell | long ftell(FILE *fp); | 返回 fp 所指定的文件中的读写位置 | 返回文件中的读写位置,否则返回 0 |
fwrite | int fwrite(char *ptr, unsigned size, unsigned n, FILE *fp); | 把 ptr 所指向的 n*size 个字节输出到 fp 所指向的文件中 | 写到 fp 文件中的数据项的个数 |
getc | int getc(FILE *fp); | 从 fp 所指向的文件中的读出下一个字符 | 返回读出的字符,若文件出错或结束返回 EOF |
getchar | int getchar(); | 从标准输入设备中读取下一个字符 | 返回字符,若文件出错或结束返回 -1 |
gets | char *gets(char *str); | 从标准输入设备中读取字符串存入 str 指向的数组 | 成功返回 str ,否则返回 NULL |
open | int open(char *filename, int mode); | 以 mode 指定的方式打开已存在的名为 filename 的文件 ( 非 ANSI 标准 ) | 返回文件号 ( 正数 ) ,如打开失败返回 -1 |
printf | int printf(char *format,args, … ); | 在 format 指定的字符串的控制下,将输出列表 args 的指输出到标准设备 | 输出字符的个数。若出错返回负数 |
prtc | int prtc(int ch, FILE * fp); | 把一个字符 ch 输出到 fp 所值的文件中 | 输出字符 ch ,若出错返回 EOF |
putchar | int putchar(char ch); | 把字符 ch 输出到 fp 标准输出设备 | 返回换行符,若失败返回 EOF |
puts | int puts(char *str); | 把 str 指向的字符串输出到标准输出设备,将 “\0” 转换为回车行 | 返回换行符,若失败返回 EOF |
putw | int putw(int w, FILE *fp); | 将一个整数 i( 即一个字 ) 写到 fp 所指的文件中 ( 非 ANSI 标准 ) | 返回读出的字符,若文件出错或结束返回 EOF |
read | int read(int fd, char *buf, unsigned count); | 从文件号 fp 所指定文件中读 count 个字节到由 buf 知识的缓冲区 ( 非 ANSI 标准 ) | 返回真正读出的字节个数,如文件结束返回 0 ,出错返回 -1 |
remove | int remove(char *fname); | 删除以 fname 为文件名的文件 | 成功返回 0 ,出错返回 -1 |
rename | int remove(char *oname, char *nname); | 把 oname 所指的文件名改为由 nname 所指的文件名 | 成功返回 0 ,出错返回 -1 |
rewind | void rewind(FILE *fp); | 将 fp 指定的文件指针置于文件头,并清除文件结束标志和错误标志 | 无 |
scanf | int scanf(char *format,args, … ); | 从标准输入设备按 format 指示的格式字符串规定的格式,输入数据给 args 所指示的单元。 args 为指针 | 读入并赋给 args 数据个数。如文件结束返回 EOF ,若出错返回 0 |
write | int write(int fd, char *buf, unsigned count); | 丛 buf 指示的缓冲区输出 count 个字符到 fd 所指的文件中 ( 非 ANSI 标准 ) | 返回实际写入的字节数,如出错返回 -1 |
5 .动态存储分配函数
在使用动态存储分配函数时,应该在源文件中使用预编译命令:
#include <stdlib.h> 或 #include “stdlib.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
callloc | void *calloc(unsigned n, unsigned size); | 分配 n 个数据项的内存连续空间,每个数据项的大小为 size | 分配内存单元的起始地址。如不成功,返回 0 |
free | void free(void *p); | 释放 p 所指内存区 | 无 |
malloc | void *malloc(unsigned size); | 分配 size 字节的内存区 | 所分配的内存区地址,如内存不够,返回 0 |
realloc | void *realloc(void *p, unsigned size); | 将 p 所指的以分配的内存区的大小改为 size 。 size 可以比原来分配的空间大或小 | 返回指向该内存区的指针。若重新分配失败,返回 NULL |
6 .其他函数
有些函数由于不便归入某一类,所以单独列出。使用这些函数时,应该在源文件中使用预编译命令:
#include <stdlib.h> 或 #include “stdlib.h”
函数名 | 函数原型 | 功能 | 返回值 |
---|---|---|---|
abs | int abs(int num); | 计算整数 num 的绝对值 | 返回计算结果 |
atof | double atof(char *str); | 将 str 指向的字符串转换为一个 double 型的值 | 返回双精度计算结果 |
atoi | int atoi(char *str); | 将 str 指向的字符串转换为一个 int 型的值 | 返回转换结果 |
atol | long atol(char *str); | 将 str 指向的字符串转换为一个 long 型的值 | 返回转换结果 |
exit | void exit(int status); | 中止程序运行。将 status 的值返回调用的过程 | 无 |
itoa | char *itoa(int n, char *str, int radix); | 将整数 n 的值按照 radix 进制转换为等价的字符串,并将结果存入 str 指向的字符串中 | 返回一个指向 str 的指针 |
labs | long labs(long num); | 计算 long 型整数 num 的绝对值 | 返回计算结果 |
ltoa | char *ltoa(long n, char *str, int radix); | 将长整数 n 的值按照 radix 进制转换为等价的字符串,并将结果存入 str 指向的字符串 | 返回一个指向 str 的指针 |
rand | int rand(); | 产生 0 到 RAND_MAX 之间的伪随机数。 RAND_MAX 在头文件中定义 | 返回一个伪随机 ( 整 ) 数 |
random | int random(int num); | 产生 0 到 num 之间的随机数。 | 返回一个随机 ( 整 ) 数 |
randomize | void randomize(); | 初始化随机函数,使用时包括头文件 time.h 。 | |