很多嵌入式工程师,基本都了解<stdio.h>,但C中除了这个还有很多其他标准库文件,今天主要介绍常用的C语言库,如<ctype.h>、<math.h>、<mem.h>、<stdlib.h>及<string.h>等
目录
一、 #include <assert.h>
二、 #include <ctype.h>
三、 #include <float.h>
四、 #include <io.h>
五、 #include <math.h>
六、 #include <mem.h>
七、 #include <setjmp.h>
八、 #include <stdio.h>
九、 #include <stdlib.h>
十、 #include <signal.h>
十一、#include <string.h>
十二、#include <time.h>
十三、#include <errno.h>
十四、#include <limits.h>
一、#include<assert.h>
1.函数原型: void assert( int expression );//如果expression结果为真,则继续执行,否则通过调用abort直接来终止程序的运行。
2.频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。
二、#include<ctype.h>
用于测试字符是否属于特定的字符类别
1.C语言isascii()函数:判断字符是否为ASCII码
2.C语言isalnum()函数:判断字符是否为字母或数字
3.C语言isalpha()函数:判断字符是否为英文字母
4.C语言iscntrl()函数:判断字符是否为控制字符//控制字符的 ASCII 编码介于 0和 31之间,以及 127
5.C语言ispunct()函数: 判断字符是否为标点符号
6.C语言isspace()函数:判断字符是否为空白字符
7.C语言isdigit()函数:判断字符是否为十进制数字
8.C语言isxdigit()函数:判断字符是否为十六进制数字
9.C语言isgraph()函数:判断字符是否除空格外的可打印字符
10.C语言isprint()函数:判断字符是否为可打印字符(含空格)
11.C语言islower()函数:判断字符是否为小写英文字母
12.C语言isupper()函数:判断字符是否为大写英文字母
13.C语言toascii()函数:把一个字符转换为ASCII
14.C语言tolower()函数:把大写字母转换为小写字母
15.C语言toupper()函数:把小写字母转换为大写字母
三、#include<float.h>
在linux中测试了下,下面的几个函数都没有链接成功
1.C语言_clear87()函数:获取并清除状态字
2.C语言_control87()函数:获取和设置浮点控制字
3.C语言_status87()函数:获取浮点处理器状态值
四、#include<io.h>
<io.h>头文件这一章主要介绍与和缓冲区相关的文件读写函数,以文件的方式处理文件
1.C语言access()函数:确定文件的访问权限
2.C语言chmod()函数:用于改变文件访问方式
3.C语言open()函数:打开一个文件
access和mode的可取值通常在FCNTL.h里面定义
access的可取值如下:
#define O_RDONLY 1
#define O_WRONLY 2
#define O_RDWR 4
access还可以是以下flag及它们之间的组合而得到的性质:
#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open with truncation */
#define O_EXCL 0x0400 /* exclusive open */
#define O_APPEND 0x0800 /* to end of file */
#define O_CHANGED 0x1000 /* user may read these bits, but */
#define O_DEVICE 0x2000 /* only RTL\io functions may touch. */
#define O_TEXT 0x4000 /* CR-LF translation */
#define O_BINARY 0x8000 /* no translation */
mode的可取值在sys\stat.h里面定义,也可以是它们的组合,如下:
#define S_IREAD 0x0100 /* owner may read */
#define S_IWRITE 0x0080 /* owner may write */
access使用O_CREAT的时候,必须指定mode参数。
如:open(s[i], 0x0100,0x0080);的意思是以O_CREAT和可写的方式打开s[i]中指出的文件,如果文件不存在,就创建它。返回这个文件的低级句柄。
4.C语言close()函数:用于关闭由open()函数所打开的文件
5.C语言creat()函数:创建指定文件名的文件
auth的可取值如下:
#define O_RDONLY 1
#define O_WRONLY 2
#define O_RDWR 4
6.C语言eof()函数:检查文件是否结束
7.C语言fdopen()函数:将流与文件句柄连接,返回FILE *
8.C语言filelength()函数:统计由open()函数所打开的文件的字节数
9.C语言isatty()函数:检查给定的设备类型
常用设备名:
stdin 标准输入设备 键盘
stdout 标准输出设备 显示器
stderr 标准错误设备
stdaux 辅助设备
stdprn 打印机
10.C语言read()函数:用于读取打开文件的内容
11.C语言write()函数:写文件
12.C语言lseek()函数:用于移动打开文件的指针
13.C语言tell()函数:获取打开文件的指针位置
五、#include<math.h>
<math.h>头文件中声明了常用的一些数学相关的运算函数,比如乘方,开方、指数、三角函数等运算。
1.C语言abs()函数:求整数的绝对值
2.C语言fabs()函数:求浮点数的绝对值
3.C语言labs()函数:取长整型绝对值
4.C语言acos()函数:求余弦值为 x 的弧度数
5.C语言asin()函数:求正弦值为 x 的弧度数
6.C语言atan()函数:求正切值为 x 的弧度数
7.C语言atan2()函数:计算Y/X的反正切值
8.C语言ceil()函数:向上舍入
9.C语言floor()函数:向下舍入
10.C语言exp()函数:求底数e的x次方
11.C语言pow()函数:指数函数(x的y次方)
12.C语言sqrt()函数:计算一个非负实数的平方根
13.C语言sin()函数:正弦函数
14.C语言cos()函数:余弦函数
15.C语言tan()函数:正切函数
16.C语言cosh()函数:计算双曲余弦值
17.C语言sinh()函数:求出指定值的双曲正弦值
18.C语言tanh()函数:计算双曲正切值
19.C语言log10()函数:求指定数值的以10为底数的对数
20.C语言log()函数:求以自然数为底数的对数
21.C语言modf()函数:求双精度数的小数部分
22.C语言fmod()函数:计算x对y的模, 即x/y的余数
23.C语言frexp()函数:把一个双精度数分解为尾数和指数
24.C语言hypot()函数:计算直角三角形的斜边长度
25.C语言ldexp()函数:计算指定的2^exp倍数
六、#include<mem.h>
<mem.h>头文件这一章主要介绍C语言或C++中,与内存处理相关的函数,如字符串的拷贝、比较、移动等等
1.C语言memccpy()函数:从sour中拷贝m个字节到目标des,遇到字符c便停止复制
2.C语言memcpy()函数:从suc中拷贝m个字节到目标des
3.C语言memmove()函数:从源区域移动m个字节到目标区域
备注:memcpy()和memmove()的区别:
如果源地址和目标地址没有重叠,那么在性能上,memcpy函数通常比memmove函数更高效。
如果源地址和目标地址有重叠(比如将一个字符串的前半部分放到后半部分的后面),或者你无法确定是否存在重叠时,应该使用memmove函数,以确保数据的正确性
4.C语言memchr()函数:对字符c搜索s区域的前m个字节
5.C语言memcmp()函数:比较m字节长的两个字符串s1和s2
6.C语言memicmp()函数:比较s1和s2的前m个字节,忽略字符的大小写
7.C语言memset()函数:置s中的所有字节为c
七、#include<setjmp.h>
1.C语言setjmp()函数:非局部转移进程,将当前系统堆栈信息保存在变量buf中,为longjmp设置跳转点
2.C语言longjump()函数:执行非局部转移进程,longjmp函数进行非局部跳转,执行到longjmp时,程序跳转到setjmp函数中进行判断,并输出结果
#include<stdio.h>
#include<setjmp.h>
#include<stdlib.h>
void subroutine(jmp_buf);
int main(void){
int value;
jmp_buf jumper;
value = setjmp(jumper);
if (value != 0) {
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);
return 0;
}
void subroutine(jmp_buf jumper) {
longjmp(jumper,1);
}
八、#include<stdio.h>
以流的方式处理文件,类似c++中的fstream
1.C语言clearerr()函数:复位错误标志
2.C语言ferror()函数:检测流上的错误
3.C语言fopen()函数:打开一个流
4.C语言fclose()函数:关闭流 stream
5.C语言feof()函数:检测流上的文件结束符
6.C语言fflush()函数:清除一个流
7.C语言fgetc()函数:从流中读取字符
8.C语言fgetchar()函数:从标准输入流中读取字符,从控制台中读取字符
9.C语言fgetpos()函数:取得当前文件指针(句柄),返回当前文件中指针(鼠标)的位置
10.C语言fgets()函数:从流中读取一字符串,注意在末尾保留换行符
11.C语言fprintf()函数:格式化输出到一个流中
12.C语言fputchar()函数:送一个字符到标准输出流
13.C语言fputs()函数:送一个字符到一个流中
14.C语言fread()函数:从一个流中读数据
15.C语言freopen()函数:替换一个流
int main(void)
{
if (freopen("D:\\out.txt", "w", stdout)== NULL)
{
fprintf(stderr, "error redirecting stdout\n");
}
printf("www.dotcpp.com\n"); //原本要在控制台中输出的字符串,输出到了文件中
fclose(stdout);
return 0;
}
16.C语言fscanf()函数:从一个流中执行格式化输入
17.C语言fseek()函数:重定位流上的文件指针
18.C语言fsetpos()函数:将文件指针定位在指定的位置上
19.C语言ftell()函数:偏移量是从文件开始算起的字节数
20.C语言fwrite()函数:写内容到流中
21.C语言getc()函数:从指定的流 stream 获取下一个字符
22.C语言getchar()函数:从标准输入流stdin流中读字符
23.C语言getche()函数:从控制台取字符
24.C语言gets()函数:从输入流中取一字符串
25.C语言getw()函数:从流中取一整数
26.C语言perror()函数:输出系统错误信息
27.C语言printf()函数:产生格式化输出的函数
28.C语言putc()函数:输出一字符到指定流中
29.C语言putchar()函数:输出一字符到标准输出流stdout上
30.C语言puts()函数:把一个字符串写入到标准输出 stdout
31.C语言putw()函数:把一字符或字送到流中
32.C语言remove()函数:删除一个文件
33.C语言rename()函数:重命名文件
34.C语言rewind()函数:将文件指针重新指向一个流的开头,类似fsetpos(stream,0)
35.C语言ungetc()函数:把一个字符退回到输入流中
36.C语言ungetch()函数:把一个字符退回到键盘缓冲区中
37.C语言tmpfile()函数:以二进制方式打开暂存文件
38.C语言tmpnam()函数:创建一个唯一的文件名
39.C语言scanf()函数:从标准输入stdin执行格式化输入类似fscanf(stdin,scanf())
40.C语言setbuf()函数:把缓冲区与流相联
41.C语言setvbuf()函数:把缓冲区与流相关,将缓冲区与流实现指定大小,指定类型的关联
42.C语言sprintf()函数:格式化输出到字符串中
43.C语言sscanf()函数:执行从字符串中的格式化输入
九、#include<stdlib.h>
1.C语言abort()函数:写一个终止信息到stderr
2.C语言atexit()函数:用于注册终止
3.C语言atof()函数:将字符串转换为浮点值//对比c++中<string>中的stof()
4.C语言atoi()函数:将字符串转换成整型数//对比c++中<string>中的stoi()
5.C语言atol()函数:将字符串转换成长整型数//对比c++中<string>中的stoll()
6.C语言bsearch()函数:用于二分法搜索
7.C语言calloc()函数:用于分配堆内存
8.C语言div()函数:用于两个整数相除//结构体div_t中的quot表示商,rem表示余数
9.C语言ecvt()函数:把浮点数转换为字符串//对比c++中<string>中的to_string()
10.C语言fcvt()函数:将浮点数转换为字符串//对比c++中<string>中的to_string()
11.C语言exit()函数:用于正常终止程序
12.C语言gcvt()函数:把浮点数转换为字符串//对比c++中<string>中的to_string()
13.C语言free()函数:用于释放已分配的内存块
14.C语言getenv()函数:用于获取当前环境中的字符串
15.C语言itoa()函数:用于把整数转换成字符串//对比c++中<string>中的to_string()
16.C语言ldiv()函数:用于两个长整型数相除
17.C语言lfind()函数:用于在给定的区域内从头到尾进行线性搜索//对比c++中<algorithm>中的find()
18.C语言lsearch()函数:用于在给定的区域内从头到尾进行线性搜索
19.C语言realloc()函数:用于重新分配指定大小的堆内存空间
20.C语言malloc()函数:用于分配指定大小的堆内存
21.C语言putenv()函数:用于改变或增加环境变量的内容
备注:char* name的格式为name=vale;如,putenv("PATH=C::\\temp");//表示将环境变量PATH的值修改为C::\\temp。
22.C语言qsort()函数:用于对记录从小到大快速排序
#include<stdio.h>
#include<stdlib.h>
typedef int (*fc)(const void*,const void*);
int compare(const void* p1,const void* p2)
{
return (*(int*)p1)-(*(int*)p2);
}
int main(void)
{
int i,arr[10]={1,6,5,7,8,9,11,24,3,10};
fc f=compare;
qsort(arr,10,sizeof(int),f);
for(i=0;i<10;i++)
{
printf("%d\t",arr[i]);
}
putchar('\n');
return 0;
}
23.C语言rand()函数:用于生成随机数
24.C语言srand()函数:初始化随机数的发生器
25.strtod():将字符串转换为浮点数
26.C语言strtod()函数:将字符串转换为浮点数
27.C语言strtol()函数:将字符串换成长整型数
28.C语言swab()函数:从源和目标区域交换字节
29.C语言system()函数:发出一个DOS命令
十、#include<signal.h>
1.C语言raise()函数:向正在执行的程序发送一个信号
十一、#include<string.h>
介绍与字符串相关的函数
1.C语言strcpy()函数:拷贝一个字符串到另一个字符串数组中
2.C语言strcat()函数:将一个字符串拼接在目标字符串的后面
3.C语言strcmp()函数:比较两个字符串的大小
4.C语言strchr()函数:查找字符串中第一个出现的指定字符的位置
5.C语言strcmpi()函数:比较两个字符串的大小
6.C语言strcspn()函数:查找连续有几个字符都不属于字符串str2内的字符
7.C语言strspn()函数:计算字符串str1中连续有几个字符都属于字符串str2
8.C语言strdup()函数:将字符串复制到新建立的空间//类似先执行malloc,然后执行strcpy,因此最后需要自己手动free
9.C语言stricmp()函数:比较两个字符串大小
10.C语言strlen()函数:计算字符串长度//注意,此长度是不包括最后的"\0"的,比sizeof少1
11.C语言strlwr()函数:将字符串中的大写字母全部转换成小写形式
12.C语言strncat()函数:在字符串尾部追加
13.C语言strncmp()函数:对指定字符串数量的两个字符串进行比较
14.C语言strnicmp()函数:对指定长度的两个字符串进行比较
15.C语言strncpy()函数:将指定数量的源字符串拼接在目标字符串的后面
16.C语言strpbrk()函数:比较字符串str1和str2中是否有相同的字符
17.C语言strrev()函数:将字符串中的字符全部颠倒顺序//逆序
18.C语言strset()函数:将一个字符串中的所有字符都设为指定字符
19.C语言strstr()函数:在一个字符串中查找另一个字符串首次出现的位置
20.C语言strtok()函数:用指定的分隔符分解字符串//注意c++中的stringstream
//c strtok
#include<string.h>
#include<stdio.h>
int main(void)
{
char input[50] = "I like www.dotcpp.com very much"; //注意不能是字符串指针
char *p = strtok(input, " ");
if(p)
{
printf("%s\n", p);
}
while(p=strtok(NULL, " "))//使用第一个参数为NULL来提取子串
{
printf("%s\n", p);
}
return 0;
}
//c++ stringstream
int main(int argc, char *argv[])
{
std::ifstream input("1.txt");
std::string abc;
while (getline(input, abc))
{
std::stringstream line(abc);
std::string word;
while (line >> word)
{
std::cout << word << std::endl;
}
std::cout << std::endl;
}
input.close();
return 0;
}
21.C语言strupr()函数:将字符串中的小写字母全部转换成大写形式
22.C语言strnset()函数:指定字符串的前几个字符都设为指定字符
23.C语言strrchr()函数:查找字符串中最后一次出现字符c的位置
十二、#include<time.h>
介绍与时间相关的函数,如获取系统时间、日期时间、处理器时间、以及相关数据类型的转换等等
1.C语言asctime()函数:将给定的日期和时间转换成ASCII码
struct *tm{
int tm_sec; //秒
int tm_min; //分
int tm_hour; //时
int tm_mday; //一个月份中的天数
int tm_mon; //月份
int tm_year; //年份
int tm_wday; //星期
int tm_yday; //一年中的天数
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
}
#include<time.h>
#include<stdio.h>
#include<string.h>
int main(void)
{
struct tm t;
char str[80];
t.tm_sec = 1;
t.tm_min = 30;
t.tm_hour = 9;
t.tm_mday = 22;
t.tm_mon = 11;
t.tm_year = 56;
t.tm_wday = 4;
t.tm_yday = 0; //不显示
t.tm_isdst = 0; //不实行夏令时
strcpy(str, asctime(&t));
printf("%s\n", str);
return 0;
}
2.C语言clock()函数:确定处理器时间
3.C语言ctime()函数:把日期和时间转换为字符串
4.C语言time()函数:获取系统时间
5.C语言difftime()函数:计算两个时刻之间的时间差
6.C语言gmtime()函数:把clock中的时间转换为格林尼治标准时间
7.C语言localtime()函数:把日期和时间转变为结构体tm
8.C语言tzset()函数:对UNIX操作系统的时间兼容性
十三、#include<errno.h>
定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。该宏扩展为类型为 int 的可更改的左值,因此它可以被一个程序读取和修改。errno 是一个全局变量,用于存储最近发生的错误代码。这个变量的类型为 int。当一个库函数发生错误时,它通常会设置 errno 以指示错误类型。以下是一些常见的错误码,它们在 <errno.h> 中定义为宏:
EPERM:操作不允许
ENOENT:没有这样的文件或目录
ESRCH:没有这样的进程
EINTR:中断的系统调用
EIO:输入/输出错误
ENXIO:没有这样的设备或地址
E2BIG:参数列表太长
ENOMEM:内存不足
EACCES:权限被拒绝
EFAULT:坏的地址
EBUSY:资源忙
EEXIST:文件已存在
EXDEV:跨设备链接
ENODEV:没有这样的设备
ENOTDIR:不是一个目录
EISDIR:是一个目录
EINVAL:无效的参数
ENFILE:系统文件表溢出
EMFILE:打开的文件过多
ENOTTY:不是终端设备
ETXTBSY:文本文件忙
EFBIG:文件过大
ENOSPC:设备上没有空间
ESPIPE:非法的寻址
EROFS:只读文件系统
EMLINK:链接过多
EPIPE:管道破裂
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL)
{
printf("Error opening file: %s\n", strerror(errno));//通过 strerror 将 errno 转换为可读的字符串,便于调试和日志记录。
return 1;
}
// 文件处理代码
fclose(file);
return 0;
}
十四、#include<limits.h>
定义了各种数据类型的限制。这些宏提供了有关整数类型(char、short、int、long 和 long long 等)和其他数据类型的最大值和最小值的信息。
宏 描述 值
字符类型
CHAR_BIT char 类型的位数 通常为 8
CHAR_MIN char 类型的最小值(有符号或无符号) -128 或 0
CHAR_MAX char 类型的最大值(有符号或无符号) 127 或 255
SCHAR_MIN signed char 类型的最小值 -128
SCHAR_MAX signed char 类型的最大值 127
UCHAR_MAX unsigned char 类型的最大值 255
短整数类型
SHRT_MIN short 类型的最小值 -32768
SHRT_MAX short 类型的最大值 32767
USHRT_MAX unsigned short 类型的最大值 65535
整数类型
INT_MIN int 类型的最小值 -2147483648
INT_MAX int 类型的最大值 2147483647
UINT_MAX unsigned int 类型的最大值 4294967295
长整数类型
LONG_MIN long 类型的最小值 -9223372036854775808L
LONG_MAX long 类型的最大值 9223372036854775807L
ULONG_MAX unsigned long 类型的最大值 18446744073709551615UL
长长整数类型
LLONG_MIN long long 类型的最小值 -9223372036854775808LL
LLONG_MAX long long 类型的最大值 9223372036854775807LL
ULLONG_MAX unsigned long long 类型的最大值 18446744073709551615ULL