linuxc标准库
C 标准库(C Standard Library)包含了一组头文件,这些头文件提供了许多函数和宏,用于处理输入输出、字符串操作、数学计算、内存管理等常见编程任务。。
头文件 功能简介 <stdio.h> 标准输入输出库,包含 printf
、scanf
、fgets
、fputs
等函数。<stdlib.h> 标准库函数,包含内存分配、程序控制、转换函数等,如 malloc
、free
、exit
、atoi
、rand
等。<string.h> 字符串操作函数,如 strlen
、strcpy
、strcat
、strcmp
等。<math.h> 数学函数库,包含各种数学运算函数,如 sin
、cos
、tan
、exp
、log
、sqrt
等。<time.h> 时间和日期函数,如 time
、clock
、difftime
、strftime
等。<ctype.h> 字符处理函数,如 isalpha
、isdigit
、isspace
、toupper
、tolower
等。<limits.h> 定义各种类型的限制值,如 INT_MAX
、CHAR_MIN
、LONG_MAX
等。<float.h> 定义浮点类型的限制值,如 FLT_MAX
、DBL_MIN
等。<assert.h> 包含宏 assert
,用于在调试时进行断言检查。<errno.h> 定义了错误码变量 errno
及相关宏,用于表示和处理错误。<stddef.h> 定义了一些通用类型和宏,如 size_t
、ptrdiff_t
、NULL
等。<signal.h> 定义了处理信号的函数和宏,如 signal
、raise
等。<setjmp.h> 提供非本地跳转功能的宏和函数,如 setjmp
、longjmp
等。<locale.h> 定义了与地域化相关的函数和宏,如 setlocale
、localeconv
等。<stdarg.h> 提供处理可变参数函数的宏,如 va_start
、va_arg
、va_end
等。<stdbool.h> 定义布尔类型和值 true
和false
。<stdint.h> 定义了精确宽度的整数类型,如 int8_t
、uint16_t
等。<inttypes.h> 提供与整数类型相关的格式化输出宏和函数。 <complex.h> 提供复数运算的函数和宏,如 cabs
、carg
等。<tgmath.h> 为泛型数学函数提供宏,以简化对不同类型数据的数学运算。 <fenv.h> 提供对浮点环境的控制,如舍入模式和异常状态。
1. stdio.h
简介
标准输入输出库
库宏:
序号 宏 & 描述 1 NULL
这个宏是一个空指针常量的值。2 _IOFBF、_IOLBF 和 _IONBF
这些宏扩展了带有特定值的整型常量表达式,并适用于 setvbuf 函数的第三个参数。3 BUFSIZ
这个宏是一个整数,该整数代表了 setbuf 函数使用的缓冲区大小。4 EOF
这个宏是一个表示已经到达文件结束的负整数。5 FOPEN_MAX
这个宏是一个整数,该整数代表了系统可以同时打开的文件数量。6 FILENAME_MAX
这个宏是一个整数,该整数代表了字符数组可以存储的文件名的最大长度。如果实现没有任何限制,则该值应为推荐的最大值。7 L_tmpnam
这个宏是一个整数,该整数代表了字符数组可以存储的由 tmpnam 函数创建的临时文件名的最大长度。8 SEEK_CUR、SEEK_END 和 SEEK_SET
这些宏是在 fseek 函数中使用,用于在一个文件中定位不同的位置。9 TMP_MAX
这个宏是 tmpnam 函数可生成的独特文件名的最大数量。10 stderr、stdin 和 stdout
这些宏是指向 FILE 类型的指针,分别对应于标准错误、标准输入和标准输出流。
函数列表:
1 int fclose(FILE *stream)
关闭流 stream。刷新所有的缓冲区。2 void clearerr(FILE *stream)
清除给定流 stream 的文件结束和错误标识符。3 int feof(FILE *stream)
测试给定流 stream 的文件结束标识符。4 int ferror(FILE *stream)
测试给定流 stream 的错误标识符。5 int fflush(FILE *stream)
刷新流 stream 的输出缓冲区。6 int fgetpos(FILE *stream, fpos_t *pos)
获取流 stream 的当前文件位置,并把它写入到 pos。7 FILE *fopen(const char *filename, const char *mode)
使用给定的模式 mode 打开 filename 所指向的文件。8 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
从给定流 stream 读取数据到 ptr 所指向的数组中。9 FILE *freopen(const char *filename, const char *mode, FILE *stream)
把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件。10 int fseek(FILE *stream, long int offset, int whence)
设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。11 int fsetpos(FILE *stream, const fpos_t *pos)
设置给定流 stream 的文件位置为给定的位置。参数 pos 是由函数 fgetpos 给定的位置。12 long int ftell(FILE *stream)
返回给定流 stream 的当前文件位置。13 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把 ptr 所指向的数组中的数据写入到给定流 stream 中。14 int remove(const char *filename)
删除给定的文件名 filename,以便它不再被访问。15 int rename(const char *old_filename, const char *new_filename)
把 old_filename 所指向的文件名改为 new_filename。16 void rewind(FILE *stream)
设置文件位置为给定流 stream 的文件的开头。17 void setbuf(FILE *stream, char *buffer)
定义流 stream 应如何缓冲。18 int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
另一个定义流 stream 应如何缓冲的函数。19 FILE *tmpfile(void)
以二进制更新模式(wb+)创建临时文件。20 char *tmpnam(char *str)
生成并返回一个有效的临时文件名,该文件名之前是不存在的。21 int fprintf(FILE *stream, const char *format, ...)
发送格式化输出到流 stream 中。22 int printf(const char *format, ...)
发送格式化输出到标准输出 stdout。23 int sprintf(char *str, const char *format, ...)
发送格式化输出到字符串。24 int vfprintf(FILE *stream, const char *format, va_list arg)
使用参数列表发送格式化输出到流 stream 中。25 int vprintf(const char *format, va_list arg)
使用参数列表发送格式化输出到标准输出 stdout。26 int vsprintf(char *str, const char *format, va_list arg)
使用参数列表发送格式化输出到字符串。27 int fscanf(FILE *stream, const char *format, ...)
从流 stream 读取格式化输入。28 int scanf(const char *format, ...)
从标准输入 stdin 读取格式化输入。29 int sscanf(const char *str, const char *format, ...)
从字符串读取格式化输入。30 int fgetc(FILE *stream)
从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。31 char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。32 int fputc(int char, FILE *stream)
把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。33 int fputs(const char *str, FILE *stream)
把字符串写入到指定的流 stream 中,但不包括空字符。34 int getc(FILE *stream)
从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。35 int getchar(void)
从标准输入 stdin 获取一个字符(一个无符号字符)。36 char *gets(char *str)
从标准输入 stdin 读取一行,并把它存储在 str 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。37 int putc(int char, FILE *stream)
把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。38 int putchar(int char)
把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。39 int puts(const char *str)
把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。40 int ungetc(int char, FILE *stream)
把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。41 void perror(const char *str)
把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。42 int snprintf(char *str, size_t size, const char *format, ...)
格式字符串到 str 中。
示例:
#include <stdio.h>
#include <string.h>/*
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
<string.h> 是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。
这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。
*/int main(int argc, char const *argv[])
{/*void *memchr(const void *str, int c, size_t n)在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。*/char str1[10] = "poiuyoor";char *cp1 = (char *)memchr(str1, 'o', 8);puts(cp1);/*int memcmp(const void *str1, const void *str2, size_t n)把 str1 和 str2 的前 n 个字节进行比较。返回值如果返回值 < 0,则表示 str1 小于 str2。如果返回值 > 0,则表示 str1 大于 str2。如果返回值 = 0,则表示 str1 等于 str2。*/char str2[10] = "poiuyppp";if (!memcmp(str1, str2, 5)){printf("前5个字符一样....\n");}/*void *memset(void *str, int c, size_t n)将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中。*/cp1=(char*)memset(str1,'t',3);puts(cp1);return 0;
}
2. string.h
简介
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
<string.h>
是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。
函数列表:
序号 函数 & 描述 1 void *memchr(const void *str, int c, size_t n)
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。2 int memcmp(const void *str1, const void *str2, size_t n)
把 str1 和 str2 的前 n 个字节进行比较。3 void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 dest。4 void *memmove(void *dest, const void *src, size_t n)
另一个用于从 src 复制 n 个字符到 dest 的函数。5 void *memset(void *str, int c, size_t n)
将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中。6 char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。7 char *strncat(char *dest, const char *src, size_t n)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。8 char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。9 int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。10 int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 进行比较,最多比较前 n 个字节。11 int strcoll(const char *str1, const char *str2)
把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。12 char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。13 char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。14 size_t strcspn(const char *str1, const char *str2)
检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。15 char *strerror(int errnum)
从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。16 size_t strlen(const char *str)
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。17 char *strpbrk(const char *str1, const char *str2)
检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。18 char *strrchr(const char *str, int c)
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。19 size_t strspn(const char *str1, const char *str2)
检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。20 char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。21 char *strtok(char *str, const char *delim)
分解字符串 str 为一组字符串,delim 为分隔符。22 size_t strxfrm(char *dest, const char *src, size_t n)
根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中。
示例:
#include <stdio.h>
#include <string.h>/*
string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
<string.h> 是 C 标准库中的一个头文件,提供了一组用于处理字符串和内存块的函数。
这些函数涵盖了字符串复制、连接、比较、搜索和内存操作等。
*/int main(int argc, char const *argv[])
{/*void *memchr(const void *str, int c, size_t n)在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。*/char str1[10] = "poiuyoor";char *cp1 = (char *)memchr(str1, 'o', 8);puts(cp1);/*int memcmp(const void *str1, const void *str2, size_t n)把 str1 和 str2 的前 n 个字节进行比较。返回值如果返回值 < 0,则表示 str1 小于 str2。如果返回值 > 0,则表示 str1 大于 str2。如果返回值 = 0,则表示 str1 等于 str2。*/char str2[10] = "poiuyppp";if (!memcmp(str1, str2, 5)){printf("前5个字符一样....\n");}/*void *memset(void *str, int c, size_t n)将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中。*/cp1=(char*)memset(str1,'t',3);puts(cp1);return 0;
}
3. math.h
简介
math.h 头文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
<math.h>
是 C 标准库中的一个头文件,包含了大量用于数学运算的函数和宏。这些函数和宏提供了基本的算术运算、三角函数、指数函数、对数函数、幂函数、舍入函数等。
函数列表:
序号 函数 & 描述 1 double acos(double x)
返回以弧度表示的 x 的反余弦。2 double asin(double x)
返回以弧度表示的 x 的反正弦。3 double atan(double x)
返回以弧度表示的 x 的反正切。4 double atan2(double y, double x)
返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。5 double cos(double x)
返回弧度角 x 的余弦。6 double cosh(double x)
返回 x 的双曲余弦。7 double sin(double x)
返回弧度角 x 的正弦。8 double sinh(double x)
返回 x 的双曲正弦。9 double tanh(double x)
返回 x 的双曲正切。10 double exp(double x)
返回 e 的 x 次幂的值。11 double frexp(double x, int *exponent)
把浮点数 x 分解成尾数和指数。返回值是尾数,并将指数存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。12 double ldexp(double x, int exponent)
返回 x 乘以 2 的 exponent 次幂。13 double log(double x)
返回 x 的自然对数(基数为 e 的对数)。14 double log10(double x)
返回 x 的常用对数(基数为 10 的对数)。15 double modf(double x, double *integer)
返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。16 double pow(double x, double y)
返回 x 的 y 次幂。17 double sqrt(double x)
返回 x 的平方根。18 double ceil(double x)
返回大于或等于 x 的最小的整数值。19 double fabs(double x)
返回 x 的绝对值。20 double floor(double x)
返回小于或等于 x 的最大的整数值。21 double fmod(double x, double y)
返回 x 除以 y 的余数。
常用数学常量:
常量 值 描述 M_PI
3.14159265358979323846 圆周率 π M_E
2.71828182845904523536 自然对数的底数 e M_LOG2E
1.44269504088896340736 log2(e) M_LOG10E
0.43429448190325182765 log10(e) M_LN2
0.69314718055994530942 ln(2) M_LN10
2.30258509299404568402 ln(10) M_PI_2
1.57079632679489661923 π/2 M_PI_4
0.78539816339744830962 π/4 M_1_PI
0.31830988618379067154 1/π M_2_PI
0.63661977236758134308 2/π M_2_SQRTPI
1.12837916709551257390 2/√π M_SQRT2
1.41421356237309504880 √2 M_SQRT1_2
0.70710678118654752440 1/√2
示例:
#include <stdio.h>
#include <math.h>/*
math.h 头文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
<math.h> 是 C 标准库中的一个头文件,包含了大量用于数学运算的函数和宏。
这些函数和宏提供了基本的算术运算、三角函数、指数函数、对数函数、幂函数、舍入函数等。
*/int main(int argc, char const *argv[])
{double x=9.0;double y=2.0;double num=-3.7;//计算平方根double res=sqrt(x);printf("平方根:sqrt(%.2f)=%.2f \n",x,res);//幂运算res=pow(x,y);printf("幂运算:pow(%.2f,%.2f)=%.2f \n",x,y,res);//向上取整res=ceil(num);printf("向上取整:ceil(%.2f)=%.2f \n",num,res);//向下取整res=floor(num);printf("向下取整:floor(%.2f)=%.2f \n",num,res);//四舍五入res=round(num);printf("四舍五入:round(%.2f)=%.2f \n",num,res);//绝对值res=fabs(num);printf("绝对值:fabs(%.2f)=%.2f \n",num,res);return 0;
}
4. time.h
简介:
time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。
<time.h>
是 C 标准库中的一个头文件,提供了处理和操作日期和时间的函数和类型。这个头文件中的函数用于获取当前时间、设置时间、格式化时间和计算时间差等。
函数列表:
序号 函数 & 描述 1 char *asctime(const struct tm *timeptr)
返回一个指向字符串的指针,它代表了结构 timeptr 的日期和时间。2 clock_t clock(void)
返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。3 char *ctime(const time_t *timer)
返回一个表示当地时间的字符串,当地时间是基于参数 timer。4 double difftime(time_t time1, time_t time2)
返回 time1 和 time2 之间相差的秒数 (time1-time2)。5 struct tm *gmtime(const time_t *timer)
timer 的值被分解为 tm 结构,并用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。6 struct tm *localtime(const time_t *timer)
timer 的值被分解为 tm 结构,并用本地时区表示。7 time_t mktime(struct tm *timeptr)
把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值。8 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。9 time_t time(time_t *timer)
计算当前日历时间,并把它编码成 time_t 格式。10 int timespec_get(struct timespec *ts, int base);
获取当前时间(C11)。
示例:
#include <stdio.h>
#include <time.h>/*
time.h 头文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。<time.h> 是 C 标准库中的一个头文件,提供了处理和操作日期和时间的函数和类型。
这个头文件中的函数用于获取当前时间、设置时间、格式化时间和计算时间差等。
*/int main(int argc, char const *argv[])
{/*time_t time(time_t *timer)计算当前日历时间,并把它编码成 time_t 格式。*/time_t current_time; // 声明time(¤t_time); // 赋值/*char *ctime(const time_t *timer)返回一个表示当地时间的字符串,当地时间是基于参数 timer。*/printf("当前时间:\n");printf("%s", ctime(¤t_time)); // 转换时间为字符串,当前时区(东八区)// 3.格式化时间/*tm 结构的定义如下:struct tm {int tm_sec; // 秒,范围从 0 到 59int tm_min; //分,范围从 0 到 59int tm_hour; //小时,范围从 0 到 23int tm_mday; //一月中的第几天,范围从 1 到 31int tm_mon; ///月,范围从 0 到 11int tm_year; //自 1900 年起的年数int tm_wday; //一周中的第几天,范围从 0 到 6int tm_yday; //一年中的第几天,范围从 0 到 365int tm_isdst; //夏令时};*/struct tm *time_info;char time_str[100]; // 声明/*struct tm *localtime(const time_t *timer)timer 的值被分解为 tm 结构,并用本地时区表示。*/time_info = localtime(¤t_time);/*size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。*/strftime(time_str, sizeof(time_str), "中国时间:%Y-%m-%d %H:%M:%S\n", time_info);puts(time_str);//延迟3秒printf("等待3秒...\n");struct timespec delay={3,0};/*int nanosleep(const struct timespec *req,struct timespec *rem);休眠指定的时间*/nanosleep(&delay,NULL);//更新时间time(¤t_time);//赋值当前时间printf("更新后的时间:%s", ctime(¤t_time));return 0;
}
5. stdlib.h
简介:
stdlib .h 头文件定义了四个变量类型、一些宏和各种通用工具函数。
<stdlib.h>
是 C 标准库中的一个头文件,提供了许多通用工具函数,包括内存分配、进程控制、排序和搜索、以及字符串转换等。
库宏 :
序号 宏 & 描述 1 NULL
这个宏是一个空指针常量的值。2 EXIT_FAILURE
这是 exit 函数失败时要返回的值。3 EXIT_SUCCESS
这是 exit 函数成功时要返回的值。4 RAND_MAX
这个宏是 rand 函数返回的最大值。5 MB_CUR_MAX
这个宏表示在多字节字符集中的最大字符数,不能大于 MB_LEN_MAX。
函数列表:
序号 函数 & 描述 1 double atof(const char *str)
把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。2 int atoi(const char *str)
把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。3 long int atol(const char *str)
把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。4 double strtod(const char *str, char **endptr)
把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。5 long int strtol(const char *str, char **endptr, int base)
把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。6 unsigned long int strtoul(const char *str, char **endptr, int base)
把参数 str 所指向的字符串转换为一个无符号长整数(类型为 unsigned long int 型)。7 void *calloc(size_t nitems, size_t size)
分配所需的内存空间,并返回一个指向它的指针。8 void free(void *ptr)
释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。9 void *malloc(size_t size)
分配所需的内存空间,并返回一个指向它的指针。10 void *realloc(void *ptr, size_t size)
尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。11 void abort(void)
使一个异常程序终止。12 int atexit(void (*func)(void))
当程序正常终止时,调用指定的函数 func。13 void exit(int status)
使程序正常终止。14 char *getenv(const char *name)
搜索 name 所指向的环境字符串,并返回相关的值给字符串。15 int system(const char *string)
由 string 指定的命令传给要被命令处理器执行的主机环境。16 void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
执行二分查找。17 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
数组排序。18 int abs(int x)
返回 x 的绝对值。19 div_t div(int numer, int denom)
分子除以分母。20 long int labs(long int x)
返回 x 的绝对值。21 ldiv_t ldiv(long int numer, long int denom)
分子除以分母。22 int rand(void)
返回一个范围在 0 到 RAND_MAX 之间的伪随机数。23 void srand(unsigned int seed)
该函数播种由函数 rand 使用的随机数发生器。24 int mblen(const char *str, size_t n)
返回参数 str 所指向的多字节字符的长度。25 size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)
把参数 str 所指向的多字节字符的字符串转换为参数 pwcs 所指向的数组。26 int mbtowc(wchar_t *pwc, const char *str, size_t n)
检查参数 str 所指向的多字节字符。27 size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)
把数组 pwcs 中存储的编码转换为多字节字符,并把它们存储在字符串 str 中。28 int wctomb(char *str, wchar_t wchar)
检查对应于参数 wchar 所给出的多字节字符的编码。
示例:
#include <stdio.h> //IO操作
#include <stdlib.h> //系统工具
#include <time.h> //时间/*
stdlib .h 头文件定义了四个变量类型、一些宏和各种通用工具函数。
<stdlib.h> 是 C 标准库中的一个头文件,
提供了许多通用工具函数,包括内存分配、进程控制、排序和搜索、以及字符串转换等。
*/int compare_int(const void *a, const void *b);int main(int argc, char const *argv[])
{// 动态内存分配/*void *calloc(size_t nitems, size_t size)分配所需的内存空间,并返回一个指向它的指针。void free(void *ptr)释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。void *malloc(size_t size)分配所需的内存空间,并返回一个指向它的指针。void *realloc(void *ptr, size_t size)尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。*//*1 double atof(const char *str)把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。2 int atoi(const char *str)把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。3 long int atol(const char *str)把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。4 double strtod(const char *str, char **endptr)把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。5 long int strtol(const char *str, char **endptr, int base)把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。*/char str1[] = "1234";char str2[] = "1000abcd";int num1;long num2;// 使用atoi转换为int类型num1 = atoi(str1);printf("atoi: %d\n", num1);// 使用strtol 转换为long类型num2 = strtol(str2, NULL, 10);printf("strtol: %ld\n", num2);// 3.生成随机数/*22 int rand(void)返回一个范围在 0 到 RAND_MAX 之间的伪随机数。23 void srand(unsigned int seed)该函数播种由函数 rand 使用的随机数发生器。*/int i2;// 设置随机数种子srand(time(NULL));// 生成5随机数for (i2 = 0; i2 < 5; i2++){printf("%d ", rand() % 100); // 生成0~99之间的随机数}printf("\n");// 4.数学函数/*18 int abs(int x)返回 x 的绝对值。long int labs(long int x)返回 x 的绝对值。*/int x = -10;long y = -10000000000L;printf("abc(%d)=%d \n", x, abs(x));printf("labc(%ld)=%ld \n", y, labs(y));// 5.执行系统命令system/*15 int system(const char *string)由 string 指定的命令传给要被命令处理器执行的主机环境。*/printf("执行系统命令system ls:\n");system("ls");//在linux上执行ls 查看文件和目录/*6.13 void exit(int status)使程序正常终止。*/printf("1 异常结束,0 正常结束\n");//exit(EXIT_SUCCESS);//printf("---------------------------------\n");/*16 void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))执行二分查找。17 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))数组排序。*/int arr[]={42,85,19,75,66,67};int length=sizeof(arr)/sizeof(arr[0]);int key=750;int *item;//使用qsort排序qsort(arr,length,sizeof(int),compare_int);printf("排序后的数组:\n");for (int i = 0; i < length; i++){printf("%d ",arr[i]);}printf("\n");//bsearch搜索,没找到返回NULL指针item=(int*)bsearch(&key,arr,length,sizeof(int),compare_int);if (item!=NULL){printf("*item=%d \n",*item);}else{//NULL代表falseprintf("item=%p \n",item);}return 0;
}int compare_int(const void * a, const void* b){return *(int*)a-*(int*)b;
}
6. ctype.h
简介:
C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和转换字符,这些函数主要用于检查字符的类型(如字母、数字、空白字符等)以及进行字符大小写转换。
库宏:
函数列表:
序号 函数 & 描述 1 int isalnum(int c)
该函数检查所传的字符是否是字母和数字。2 int isalpha(int c)
该函数检查所传的字符是否是字母。3 int iscntrl(int c)
该函数检查所传的字符是否是控制字符。4 int isdigit(int c)
该函数检查所传的字符是否是十进制数字。5 int isgraph(int c)
该函数检查所传的字符是否有图形表示法。6 int islower(int c)
该函数检查所传的字符是否是小写字母。7 int isprint(int c)
该函数检查所传的字符是否是可打印的。8 int ispunct(int c)
该函数检查所传的字符是否是标点符号字符。9 int isspace(int c)
该函数检查所传的字符是否是空白字符。10 int isupper(int c)
该函数检查所传的字符是否是大写字母。11 int isxdigit(int c)
该函数检查所传的字符是否是十六进制数字。序号 函数 & 描述转换函数 1 int tolower(int c)
该函数把大写字母转换为小写字母。2 int toupper(int c)
该函数把小写字母转换为大写字母。
示例:
#include <stdio.h>
#include <ctype.h> //试和转换字符 的头文件/*
C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和转换字符,
这些函数主要用于检查字符的类型(如字母、数字、空白字符等)以及进行字符大小写转换。
<ctype.h> 提供了一组方便的函数,用于处理字符的分类和转换操作,是 C 标准库中处理字符操作的重要工具。
*/int main(int argc, char const *argv[])
{char ch = 'A';/*2 int isalpha(int c)该函数检查所传的字符是否是字母。*/if (isalpha(ch)){printf("%c\n", ch);}else{printf("我不是字母...\n");}/*4 int isdigit(int c)该函数检查所传的字符是否是十进制数字。 字符串的数字*/char ch2 = '5';if (isdigit(ch2)){printf("%c\n", ch2);}else{printf("我不是数字...\n");}/*1 int tolower(int c)该函数把大写字母转换为小写字母。2 int toupper(int c)该函数把小写字母转换为大写字母。*/ch2='H';printf("%c\n",tolower(ch2));ch2='i';printf("%c\n",toupper(ch2));return 0;
}
7. errno.h
简介:
C 标准库的 errno.h 头文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。该宏扩展为类型为 int 的可更改的左值,因此它可以被一个程序读取和修改。
<errno.h>
是 C 标准库中的一个头文件,提供了一种在程序中报告和处理错误的机制。这个头文件定义了宏和变量,用于指示和描述运行时错误的类型。errno.h 头文件定义了一系列表示不同错误代码的宏,这些宏应扩展为类型为 int 的整数常量表达式。
errno
是一个全局变量,用于存储最近发生的错误代码。这个变量的类型为int
。当一个库函数发生错误时,它通常会设置errno
以指示错误类型。例如,在文件操作中,如果
fopen
函数因为文件不存在而失败,它会将errno
设置为ENOENT
。常用错误码
以下是一些常见的错误码,它们在
<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
:管道破裂注意事项
- 线程安全:在多线程程序中,
errno
通常实现为线程局部存储(Thread-Local Storage, TLS),以确保每个线程有独立的错误码。- 初始值:在成功调用的情况下,库函数通常不会修改
errno
的值。因此在检查错误之前,应确保errno
被设置为 0。- 错误码范围:不同的操作系统和 C 标准库实现可能会定义额外的错误码。程序应避免依赖特定错误码的数值。
错误处理建议
- 检查返回值:在调用可能失败的函数时,总是检查其返回值。
- 设定
errno
为 0:在调用一个函数前,可以将errno
设定为 0,以便在调用后检查errno
是否被修改。- 使用
strerror
:通过strerror
将errno
转换为可读的字符串,便于调试和日志记录。总之,
<errno.h>
提供了一种标准化的方式来报告和处理程序中的错误,使得错误处理代码更为一致和可维护。
宏列表:
序号 宏 & 描述 1 extern int errno
这是通过系统调用设置的宏,在错误事件中的某些库函数表明了什么发生了错误。2 EDOM Domain Error
这个宏表示一个域错误,它在输入参数超出数学函数定义的域时发生,errno 被设置为 EDOM。3 ERANGE Range Error
这个宏表示一个范围错误,它在输入参数超出数学函数定义的范围时发生,errno 被设置为 ERANGE。
示例:
#include <stdio.h>#include <assert.h> //断言
#include <errno.h> //错误处理/*
C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。
assert.h 标准库主要用于在程序运行时进行断言断言是一种用于测试假设的手段,通常用于调试阶段,以便在程序出现不符合预期的状态时立即发现问题。
<assert.h> 提供的断言机制是 C 语言中一个有用的工具,帮助开发人员在早期发现和修复程序中的错误。
已定义的宏 assert 指向另一个宏 NDEBUG,宏 NDEBUG 不是 <assert.h> 的一部分。
如果已在引用 <assert.h> 的源文件中定义 NDEBUG 为宏名称,则 assert 宏的定义如下:assert(expression)
assert 宏用于测试表达式 expression 是否为真。如果 expression 为假(即结果为 0),assert 会输出一条错误信息并终止程序的执行。
这个错误信息包括以下内容:触发断言失败的表达式
源文件名
行号
在发布版本中,可以通过定义 NDEBUG 来禁用所有的 assert 断言。assertde行为是:
符合条件(表达式为真):程序继续正常执行;
不符合条件(表达式为假):程序立即终止,并输出一条错误信息,包括失败的表达式、文件名和行号。重要注意事项:
调试节点使用:assert 通常在开发和调试阶段使用,用于不活程序中逻辑错误,它可以验证程序的假设是否成立。生产环境:再生产环境中,一般禁用assert。可以通过定义 NDEBUG 宏来禁用所有断言;#define NDEBUG#inclue <assert.h>
代替方案:在生产代码中,通常使用更健壮的错误处理机制,例如 if语句和errno。C 标准库的 errno.h 头文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误。
该宏扩展为类型为 int 的可更改的左值,因此它可以被一个程序读取和修改。
<errno.h> 是 C 标准库中的一个头文件,提供了一种在程序中报告和处理错误的机制。
这个头文件定义了宏和变量,用于指示和描述运行时错误的类型。errno.h 头文件定义了一系列表示不同错误代码的宏,这些宏应扩展为类型为 int 的整数常量表达式。
errno 是一个全局变量,用于存储最近发生的错误代码。这个变量的类型为 int。
当一个库函数发生错误时,它通常会设置 errno 以指示错误类型。例如,在文件操作中,如果 fopen 函数因为文件不存在而失败,它会将 errno 设置为 ENOENT。*/int main(int argc, char const *argv[])
{ //1.入门 断言int x=10;int y=0;//断言assert符合条件继续执行assert(x==10);printf("x是10,程序正常继续执行......\n");//断言assert 不符合条件,程序终止并输出错误信息//assert(y!=0);//printf("y!=0......程序终止并输出错误信息\n");//2.进阶 断言FILE *file;//打开文件file=fopen("不存在的文件.txt","r");if (file==NULL){//文件大失败,检查 errnoperror("打开文件失败"); }else{printf("打开文件成功...\n");fclose(file);}//断言文件不存在assert(errno==ENOENT);//ENOENT (2): 文件或目录不存在。//符合条件(断言表达式为真):件程序继续正常执行printf("符合条件(断言表达式为真):件程序继续正常执行 \n");return 0;
}
8. signal.h
简介:
<signal.h>
是 C 标准库中的一个头文件,用于处理信号。signal.h 头文件定义了一个变量类型 sig_atomic_t、两个函数调用和一些宏来处理程序执行期间报告的不同信号。
信号是一种异步通知机制,允许进程在特定事件发生时执行预定义的处理函数。
下面是一个简单的示例程序,演示如何使用 signal 函数来捕捉 SIGINT 信号(通常由 Ctrl+C 产生)。
函数列表:
常量 描述 SIGABRT
由 abort
函数产生的信号,表示异常终止SIGALRM
由 alarm
函数设定的定时器到期信号SIGBUS
非法内存访问(例如,访问未对齐的内存地址) SIGCHLD
子进程状态改变(退出或停止) SIGCONT
继续执行被暂停的进程 SIGFPE
算术错误(例如,除零错误、浮点异常) SIGHUP
挂起信号(通常用于检测终端断开) SIGILL
非法指令 SIGINT
中断信号(通常由 Ctrl+C 产生) SIGKILL
立即终止信号(不能被捕捉或忽略) SIGPIPE
向无读进程的管道写数据 SIGQUIT
终端退出信号(通常由 Ctrl+\ 产生),生成核心转储 SIGSEGV
段错误(非法内存访问) SIGSTOP
停止进程的执行(不能被捕捉或忽略) SIGTERM
终止信号 SIGTSTP
暂停进程(通常由 Ctrl+Z 产生) SIGTTIN
后台进程从终端读数据时产生的信号 SIGTTOU
后台进程向终端写数据时产生的信号 SIGUSR1
用户自定义信号 1 SIGUSR2
用户自定义信号 2 SIGPOLL
I/O 事件(取代 SIGIO) SIGPROF
定时器到期信号(由 setitimer
设置的 profiling timer)SIGSYS
非法系统调用 SIGTRAP
断点或陷阱指令 SIGURG
套接字紧急条件信号 SIGVTALRM
虚拟时钟定时器到期信号 SIGXCPU
超过 CPU 时间限制 SIGXFSZ
超过文件大小限制