Skip to content

Latest commit

 

History

History
760 lines (641 loc) · 27.4 KB

File metadata and controls

760 lines (641 loc) · 27.4 KB

LIBRARY


index


stdio

  • 核心概念

    • 流(数据源/目标的抽象)
    • FILE* 文件指针
    • 预定义流
      • stdin:标准输入
      • stdout:标准输出
      • stderr:标准错误
    • 文件操作模式 |模式|描述|文件存在|文件不存在| |----|----|--------|----------| |"r"|读|打开|失败| |"w"|写|清空|创建| |"a"|追加|尾部写入|创建| |"r+"|读写|打开|失败| |"w+"|读写|清空|创建| |"a+"|读写追加|尾部写入|创建| |"b"|搭配其他选项表二进制|||
  • 文件操作函数

    • 打开/关闭
    FILE *fopen(const char *filename, const char *mode);
    int fclose(FILE *stream);
    
    • 临时文件
    FILE *tmpfile(void);  // 创建临时文件,wb+模式
    char *tmpnam(char *s);// 生成唯一临时文件名
    
    • 删除/重命名
    int remove(const char *filename);   // 删除文件
    int rename(const char *oldname, const char *newname);   // 重命名
    
    • 文件定位
    fseek(FILE *stream, long offset, int whence);  // 移动指针
    long ftell(FILE *stream);                      // 获取当前位置
    void rewind(FILE *stream);                     // 重置到文件开头
    
    // 参数 whence:
    //  SEEK_SET(文件头) SEEK_CUR(当前位置) SEEK_END(文件尾)
    
    • 获取文件描述符
    // #include<unistd.h>
    int fileno(FILE *stream);
    
  • 输入输出函数

    • 字符I/O
    int fgetc(FILE *stream);         // 读取字符(函数)
    int getc(FILE *stream);          // 同fgetc(宏)
    int getchar(void);               // getc(stdin)
    
    int fputc(int c, FILE *stream);  // 写入字符
    int putc(int c, FILE *stream);   // 同fputc
    int putchar(int c);              // putc(c, stdout)
    
    • 行I/O
    char *fgets(char *s, int size, FILE *stream);  // 读取一行(保留换行符) != NULL
    int fputs(const char *s, FILE *stream);        // 写入(不添加换行符)
    
    • 格式化I/O
    printf("Value: %d\n", x);              // 输出到stdout
    fprintf(file, "Value: %f", y);         // 输出到文件
    snprintf(buf, size, "Sum: %d", a+b);   // 解析到字符串(限制长度)
    
    scanf("%d", &num);                     // 从stdin读取
    fscanf(file, "%s %d", str, &id);       // 从文件读取
    sscanf(buffer, "%d,%f", &x, &y);       // 从字符串解析
    
    • 二进制I/O(块读写)
    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    
  • 错误处理

void perror(const char *s); // 打印系统错误信息(配合<errno.h>使用)
int feof(FILE *stream);    // 检测文件结束标志(返回非0表示到达结尾)
int ferror(FILE *stream);  // 检测文件流错误标志(返回非0表示错误)
void clearerr(FILE *stream); // 清除错误/EOF标志
  • 缓冲
    • 全缓冲(文件默认)
    • 行缓冲(终端默认)
    • 无缓冲(stderr)
    • setbuf(FILE *stream, char *buffer);:自定义缓冲区
    • BUFSIZ:系统级缓冲区大小常量
fflush(FILE *stream);  // 强制刷新输出缓冲区
// 若 stream 为 NULL,刷新所有输出流

stdlib

  • 动态内存管理

看这里哦

  • 程序终止与控制

    • void exit(int status)
      • 正常终止程序并调用atexit里注册的函数
      • 参数(返回码)设置为(EXIT_SUCCESSEXIT_FAILURE)
    • void abort(void)
      • 异常终止程序,不执行清理操作,直接终止进程(触发 SIGABRT 信号)
    • int atexit(void (*func)(void))
      • 注册程序终止时执行的函数(按注册的逆序调用)
  • 系统交互

    • int system(const char* command)
      • 执行操作系统命令
      • 返回命令执行的状态码
    • char* getenv(const char* name)
      • 获取环境变量值
      • 返回的字符串不可修改
  • 随机数生成

    • int rand(void)
      • 生成伪随机数
      • 范围 0RAND_MAX
    • void srand(unsigned int seed)
      • 设置随机数种子,通常用 time(NULL) 初始化
  • 搜索与排序

    • void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
      • 快速排序数组
    • void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
      • 在已排序数组中二分查找元素
      • 找到返回元素地址,否则返回 NULL
  • 数值转换

    • atoi,atof,atol
      • 将字符串转换为整数、浮点数、长整数
      • 无法检测错误
    • strtol,strtod
      • 更安全的字符串转换,可检测错误和进制
    • abs,labs,llabs
      • 返回 整数/长整数/长长整数 的绝对值

math

1. 基本数学运算

(1) 绝对值函数

函数 描述 示例
int abs(int x) 整数绝对值(在 <stdlib.h>) abs(-5) = 5
double fabs(double x) 浮点数绝对值 fabs(-3.14) = 3.14
long labs(long x) 长整数绝对值 labs(-100L) = 100

(2) 幂与开方

函数 描述 示例
double pow(double x, double y) 计算 ( x^y ) pow(2, 3) = 8.0
double sqrt(double x) 平方根 ( \sqrt{x} ) sqrt(16) = 4.0
double cbrt(double x) (C99) 立方根 ( \sqrt[3]{x} ) cbrt(27) = 3.0
double hypot(double x, double y) 计算 ( \sqrt{x^2 + y^2} )(直角三角形的斜边) hypot(3, 4) = 5.0

(3) 取整与余数

函数 描述 示例
double ceil(double x) 向上取整 ceil(3.2) = 4.0
double floor(double x) 向下取整 floor(3.9) = 3.0
double round(double x) (C99) 四舍五入 round(3.5) = 4.0
double trunc(double x) (C99) 截断小数部分 trunc(3.9) = 3.0
double fmod(double x, double y) 浮点数取余 fmod(5.5, 2) = 1.5
double remainder(double x, double y) (C99) IEEE 754 标准余数 remainder(10, 3) = 1.0

2. 三角函数(角度单位:弧度)

函数 描述 示例
double sin(double x) 正弦函数 sin(M_PI/2) ≈ 1.0
double cos(double x) 余弦函数 cos(0) = 1.0
double tan(double x) 正切函数 tan(M_PI/4) ≈ 1.0
double asin(double x) 反正弦(结果在 ([-π/2, π/2])) asin(1) ≈ 1.5708
double acos(double x) 反余弦(结果在 ([0, π])) acos(0) ≈ 1.5708
double atan(double x) 反正切(结果在 ([-π/2, π/2])) atan(1) ≈ 0.7854
double atan2(double y, double x) 计算 ( \arctan(y/x) )(考虑象限) atan2(1, 1) ≈ 0.7854

注意

  • 使用三角函数时,通常需要先转换角度为弧度:
    double degrees = 45.0;
    double radians = degrees * (M_PI / 180.0);
    printf("sin(45°) = %f\n", sin(radians));
  • M_PI 不是标准 C 定义的常量,但大多数编译器支持(需 #define _USE_MATH_DEFINES).

3. 指数与对数函数

函数 描述 示例
double exp(double x) 自然指数 ( e^x ) exp(1) ≈ 2.71828
double exp2(double x) (C99) ( 2^x ) exp2(3) = 8.0
double log(double x) 自然对数 ( \ln(x) ) log(10) ≈ 2.30259
double log10(double x) 常用对数 ( \log_{10}(x) ) log10(100) = 2.0
double log2(double x) (C99) 二进制对数 ( \log_2(x) ) log2(8) = 3.0

4. 双曲函数

函数 描述 示例
double sinh(double x) 双曲正弦 sinh(1) ≈ 1.1752
double cosh(double x) 双曲余弦 cosh(0) = 1.0
double tanh(double x) 双曲正切 tanh(1) ≈ 0.7616

5. 误差与伽马函数(C99)

函数 描述
double erf(double x) 误差函数
double erfc(double x) 互补误差函数
double tgamma(double x) 伽马函数 ( \Gamma(x) )
double lgamma(double x) ( \ln(|\Gamma(x)|) )

6. 浮点数操作

函数 描述
double frexp(double x, int *exp) 分解浮点数为尾数和指数
double ldexp(double x, int exp) ( x \times 2^{exp} )
double modf(double x, double *intpart) 分离整数和小数部分

7. 其他函数

函数 描述
double fmax(double x, double y) (C99) 返回较大值
double fmin(double x, double y) (C99) 返回较小值
double fdim(double x, double y) (C99) 返回 ( x - y )(如果 ( x > y ),否则 0)
double copysign(double x, double y) (C99) 返回 x 的绝对值 + y 的符号

8. 宏与常量

描述
INFINITY 表示无穷大(如 1.0 / 0.0)
NAN 表示非数字(如 0.0 / 0.0)
HUGE_VAL 表示极大值(溢出时返回)
M_E 自然对数底 ( e )(非标准)
M_PI 圆周率 ( \pi )(非标准)

ctype

<ctype.h> 是 C 语言标准库中用于字符分类和转换的头文件,提供了一系列函数用于判断字符的类型(如字母、数字、空白符等)以及大小写转换.这些函数通常以 int 类型参数(字符的 ASCII 值)作为输入,并返回 int 类型(非零表示真,零表示假).

1. 字符分类函数

这些函数用于检查字符是否属于特定类别,返回 非零值(真)0(假).

函数 描述 示例
int isalpha(int c) 检查 c 是否是字母(A-Za-z) isalpha('A') → 非零
int isdigit(int c) 检查 c 是否是数字(0-9) isdigit('5') → 非零
int isalnum(int c) 检查 c 是否是字母或数字 isalnum('a') → 非零
int isxdigit(int c) 检查 c 是否是十六进制数字(0-9A-Fa-f) isxdigit('F') → 非零
int islower(int c) 检查 c 是否是小写字母(a-z) islower('a') → 非零
int isupper(int c) 检查 c 是否是大写字母(A-Z) isupper('A') → 非零
int isspace(int c) 检查 c 是否是空白字符( \t\n\r\v\f) isspace(' ') → 非零
int isblank(int c) (C99) 检查 c 是否是空白( \t) isblank('\t') → 非零
int isprint(int c) 检查 c 是否是可打印字符(包括空格) isprint('A') → 非零
int isgraph(int c) 检查 c 是否是可打印字符(不包括空格) isgraph(' ') → 0
int iscntrl(int c) 检查 c 是否是控制字符(ASCII 0-31 或 127) iscntrl('\n') → 非零
int ispunct(int c) 检查 c 是否是标点符号(非字母、数字、空格) ispunct('!') → 非零

2. 字符转换函数

函数 描述 示例
int tolower(int c) c 转换为小写字母(如果 c 是大写字母) tolower('A')'a'
int toupper(int c) c 转换为大写字母(如果 c 是小写字母) toupper('a')'A'

注意

  • 如果 c 不是字母,tolower()toupper() 直接返回 c.
  • 这些函数只适用于 ASCII 字符,不适用于 Unicode.

time

time.h

  1. 时间表示方式
  • typedef long time_t;(通常是自 1970-01-01 00:00:00 UTC 的秒数,即 Unix 时间戳)
  • struct tm 存储分解时间(Broken-Down Time),包含以下字段
struct tm {
    int tm_sec;   // 秒 [0, 60](60 用于闰秒)
    int tm_min;   // 分钟 [0, 59]
    int tm_hour;  // 小时 [0, 23]
    int tm_mday;  // 月中的第几天 [1, 31]
    int tm_mon;   // 月份 [0, 11](0 = 一月)
    int tm_year;  // 自 1900 年起的年份
    int tm_wday;  // 星期几 [0, 6](0 = 周日)
    int tm_yday;  // 年中的第几天 [0, 365]
    int tm_isdst; // 夏令时标志(>0: 夏令时,=0: 非夏令时,<0: 未知)
};
  • typedef long clock_t;(表示 CPU 时间,单位通常是时钟滴答)
  1. 时间获取函数
  • time_t time(time_t *timer); 获取当前时间戳
  • clock_t clock(void); 获取程序运行的 CPU 时间(单位是 CLOCKS_PER_SEC 的分数).
  • double difftime(time_t end, time_t start); 计算两个 time_t 时间的差值(单位:秒).
  1. 时间转换函数
  • struct tm *gmtime(const time_t *timer);time_t 转换为 UTC 时间(世界标准时间).
  • struct tm *localtime(const time_t *timer);time_t 转换为 本地时间(受时区和夏令时影响).
  • time_t mktime(struct tm *timeptr);struct tm 转换回 time_t(自动调整非法时间).
  • char *asctime(const struct tm *timeptr);struct tm 转换为固定格式的字符串(如 "Sun Jan 1 00:00:00 2023\n").
  • char *ctime(const time_t *timer);time_t 转换为本地时间的字符串
  • size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
  • strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", t);
  • 常用格式符
    格式符 说明 示例
    %Y 年份(4 位) 2024
    %m 月份(01-12) 02
    %d 日(01-31) 15
    %H 小时(00-23) 14
    %M 分钟(00-59) 30
    %S 秒(00-60) 45
    %A 星期全名 Monday
    %a 星期缩写 Mon
    %B 月份全名 February
    %b 月份缩写 Feb
    %c 完整日期时间 Mon Feb 15 14:30:45 2024

errno

1. errno 全局变量

extern int errno; // 声明全局错误变量

  • 特点
    • 由系统或库函数自动设置,程序启动时初始化为 0(表示无错误).
    • 每个线程有独立的 errno(多线程安全).
    • 必须在函数返回后立即检查,否则可能被后续操作覆盖.

2. 标准错误码宏

描述
EPERM 1 操作不允许(权限不足)
ENOENT 2 文件或目录不存在
EINTR 4 系统调用被中断
EIO 5 输入/输出错误
EBADF 9 错误的文件描述符
EAGAIN 11 资源暂时不可用(可重试)
ENOMEM 12 内存不足
EACCES 13 权限不足
EFAULT 14 错误的地址
EBUSY 16 资源忙
EEXIST 17 文件已存在
EINVAL 22 无效参数
ENFILE 23 系统打开文件数过多
EMFILE 24 进程打开文件数过多
ENOSPC 28 设备无剩余空间
EDOM 33 数学参数超出定义域
ERANGE 34 结果超出范围

3. 错误处理函数

  • (1) perror()

    • void perror(const char *s);
    • 打印错误描述(自动附加 errno 对应的错误信息).
  • (2) strerror()

    • char *strerror(int errnum);
    • 返回错误码对应的字符串描述.

assert

<assert.h> 是 C 语言标准库中用于**程序断言(Assertion)**的头文件,它提供了一个宏 assert(),用于在程序运行时检查条件是否满足,如果条件为假(false),则终止程序并输出错误信息.

  • void assert(int expression);

    • 如果 expression0(假)
      1. 打印错误信息(包含文件名、行号、断言条件).
      2. 调用 abort() 终止程序.
    • 如果 expression0(真),则不做任何操作.
  • 2. 启用/禁用断言

  • (1) 调试模式(默认启用)

  • 不定义 NDEBUG 宏,assert() 生效:

  • (2) 发布模式(禁用断言)

    • 定义 NDEBUG 宏,assert() 会被忽略
  • 3. 使用场景

    • (1) 检查函数参数合法性
    • (2) 检查程序逻辑
    • (3) 调试复杂条件
  • 4. 注意事项

    • 仅在 调试模式(NDEBUG 未定义) 下生效.
    • 在发布版本中可以通过定义 NDEBUG 宏禁用断言.
    • assert 不能替代错误处理

stdarg

stdarg.h 实现可变参数,底层设计可以概括为:通过指针算数,运行时手动遍历函数的调用栈

  1. 核心宏和类型
  • typedef char* va_list 一个指针,指向当前可变参数
  • va_start 初始化 va_list ,让它指向第一个可变参数
    • #define va_start(ap, last_fixed) ( (ap) = (va_list)&(last_fixed) + sizeof(last_fixed) )
      • &last_fixed 获取最后一个固定你参数在栈上的位置
      • + sizeof(last_fixed) 加上最后一个固定参数的大小到第一个可变参数的地址
  • va_arg(ap, type) 获取当前可变参数,并移动指针到下一个参数
    • #define va_arg(ap, type) ( *(type*)((ap) += sizeof(type)) )
      • ap 地址取出一个 type 类型值
      • 移动 ap 到下一个地址
      • 这里先增加指针再解引用,因为 += 返回的是左值
  • #define va_end(ap) ((void)0) 清理工作

这里没有考虑内存对齐,调用约定等问题,实际中编译器会处理

  • 使用示例
#include <stdio.h>
#include <stdarg.h>

// 计算 n 个整数的和
int sum(int count, ...) {
    int total = 0;
    va_list args;                // 1. 声明一个 va_list 变量
    va_start(args, count);       // 2. 初始化 args,指向第一个可变参数
    for (int i = 0; i < count; i++) {
        int value = va_arg(args, int);  // 3. 依次取出 int 类型的参数
        total += value;
    }
    va_end(args);                // 4. 清理(习惯性调用)
    return total;
}

int main() {
    printf("1 + 2 = %d\n", sum(2, 1, 2));               // 3 个参数:个数 + 2 个加数
    printf("1 + 2 + 3 + 4 = %d\n", sum(4, 1, 2, 3, 4)); // 5 个参数
    return 0;
}

signal

信号概述

  • 信号 是操作系统发送给进程的一种异步通知,用于告知进程发生了某种事件

  • 由以下方式触发

    • Ctrl - C
    • 硬件异常
    • 其他进程发送
    • 操作系统事件
  • 标准信号列表

信号 行为 描述
SIGHUP 1 A 挂起或控制进程终止
SIGINT 2 A C + c
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF kill -9 强制杀死
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂
SIGALRM 14 A 闹钟alarm()信号
SIGTERM 15 A kill默认
SIGCHLD 17 B 子进程结束
  • A 终止进程

  • B 忽略

  • C 终止进程并core dump

  • D 暂停

  • E 不能捕获

  • F 不可忽略

  • 信号处理函数

    • void (*signal(int sig, void (*handler)(int)))(int);

      • 设置信号 sig 的处理函数 handler
      • handler : SIG_IGNSIG_DFL 或信号处理函数
      • 成功:返回之前的信号处理函数
      • 失败:返回 SIG_ERR
      • signal(SIGINT, handler); // 捕获 Ctrl+C
    • int raise(int sig);

      • 向当前进程发送信号 sig
  • 实际开发的使用场景

    • 捕获 SIGTERM 进行资源清理
    • 忽略 SIGINT 让程序不被 Ctrl+C 杀死
    • 捕获 SIGSEGV 记录错误信息
    • 使用 SIGALRM 实现超时机制

stddef

定义基本类型和宏的头文件,提供与平台无关的类型定义和常用常量,在各种底层编程和跨平台开发中非常有用

  1. 核心定义
  • #define NULL ((void *)0)

    • 表示空指针
  • typedef unsigned int size_t;

    • 实际类型取决于平台
  • typedef int ptrdiff_t;

    • 指针差值类型,表示两个指针之间的差值
    • 实际类型取决于平台
  • #define offsetof(type, member) ((size_t)&(((type *)0)->member))

    • 计算结构体成员的字节偏移量
  • typedef unsigned short wchar_t;

    • 宽字符类型
    • 实际类型取决于平台
  1. 跨平台注意
  • size_t实际大小
    • 32 位系统通常是 unsigned int
    • 64 位系统通常是 unsigned long
  • NULL 的实现差异
    • C 中定义为 ((void *)0)
    • C++ 中可能是 0nullptr
    • 偏移量计算的限制:offsetof不能用于非标准布局类型(如含虚函数的 C++ 类)

limits

定义基本数据类型取值范围,提供了各种整数类型的最大值和最小值的宏定义

  • 1. 核心宏定义 | 宏 | 含义 | 典型值(32位系统) | |----|------|------------------| | CHAR_BIT | 一个字节的位数 | 8 | | SCHAR_MIN | signed char 最小值 | -128 | | SCHAR_MAX | signed char 最大值 | 127 | | UCHAR_MAX | unsigned char 最大值 | 255 | | CHAR_MIN | char 最小值(取决于实现) | -128 或 0 | | CHAR_MAX | char 最大值(取决于实现) | 127 或 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 最小值 | -2147483648 | | LONG_MAX | long 最大值 | 2147483647 | | ULONG_MAX | unsigned long 最大值 | 4294967295 | | LLONG_MIN (C99) | long long 最小值 | -9223372036854775808 | | LLONG_MAX (C99) | long long 最大值 | 9223372036854775807 | | ULLONG_MAX (C99) | unsigned long long 最大值 | 18446744073709551615 |

  • <limits.h> 主要用于

    • 防止数值溢出
    • 编写可移植代码
    • 系统属性检测
    • 安全输入验证

float

<float.h> 是 C 语言标准库中定义浮点数特性的头文件,它提供了浮点类型的取值范围、精度和误差相关的宏定义。

  • 1. 核心宏定义 | 宏 | 含义 | 典型值(IEEE 754) | |----|------|------------------| | FLT_RADIX | 浮点数基数(通常为 2) | 2 | | FLT_MANT_DIG | float 尾数位数 | 24 | | DBL_MANT_DIG | double 尾数位数 | 53 | | LDBL_MANT_DIG | long double 尾数位数 | 64 | | FLT_MIN | float 最小正规范化值 | 1.175494e-38 | | FLT_MAX | float 最大值 | 3.402823e+38 | | DBL_MIN | double 最小正规范化值 | 2.225074e-308 | | DBL_MAX | double 最大值 | 1.797693e+308 | | LDBL_MIN | long double 最小正规范化值 | 3.362103e-4932 | | LDBL_MAX | long double 最大值 | 1.189731e+4932 | | FLT_DIG | float 的十进制有效数字 | 6 | | DBL_DIG | double 的十进制有效数字 | 15 | | LDBL_DIG | long double 的十进制有效数字 | 18 | | FLT_EPSILON | float 的最小可表示差值 | 1.192093e-07 | | DBL_EPSILON | double 的最小可表示差值 | 2.220446e-16 | | LDBL_EPSILON | long double 的最小可表示差值 | 1.084202e-19 | | FLT_ROUNDS | 当前浮点数舍入模式 |
  • <float.h> 主要用于:
    • 浮点数安全比较
    • 数值范围验证
    • 精度控制
    • 跨平台浮点运算

stdbool

用于布尔类型支持的头文件,C99 引入,提供了更清晰的布尔类型定义

  1. 核心定义
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

stdint

定义固定宽度整数类型的头文件,C99,提供了明确位宽的整数类型

  1. 核心整数类型定义 | 类型 | 位宽 | 取值范围 | 对应传统类型 | |------|------|----------|--------------| | int8_t | 8位 | -128 ~ 127 | signed char | | uint8_t | 8位 | 0 ~ 255 | unsigned char | | int16_t | 16位 | -32768 ~ 32767 | short | | uint16_t | 16位 | 0 ~ 65535 | unsigned short | | int32_t | 32位 | -2147483648 ~ 2147483647 | int | | uint32_t | 32位 | 0 ~ 4294967295 | unsigned int | | int64_t | 64位 | -2^63 ~ 2^63-1 | long long | | uint64_t | 64位 | 0 ~ 2^64-1 | unsigned long long | | int_least8_t | 至少8位的有符号整数 | | uint_least8_t | 至少8位的无符号整数 | | ...(16/32/64位同理) | ... | | int_fast8_t | 最快处理的至少8位有符号整数 | | uint_fast8_t | 最快处理的至少8位无符号整数 | | ...(16/32/64位同理) | ... | | intmax_t | 系统支持的最大有符号整数 | | uintmax_t | 系统支持的最大无符号整数 | | intptr_t | 可保存指针值的有符号整数 | | uintptr_t | 可保存指针值的无符号整数 |

  2. 极限值宏定义 | 宏 | 含义 | |----|------| | INT8_MIN/INT8_MAX | int8_t 的最小/最大值 | | UINT8_MAX | uint8_t 的最大值 | | INTMAX_MIN/INTMAX_MAX | intmax_t 的极限值 | | UINTMAX_MAX | uintmax_t 的最大值 | | PTRDIFF_MIN/PTRDIFF_MAX | ptrdiff_t 的极限值 | | SIZE_MAX | size_t 的最大值 |

  3. 格式化输出宏 | 宏 | 对应类型 | 格式化字符串 | |----|----------|--------------| | PRIi8/PRIu8 | int8_t/uint8_t | %hhd/%hhu | | PRIi16/PRIu16 | int16_t/uint16_t | %hd/%hu | | PRIi32/PRIu32 | int32_t/uint32_t | %d/%u | | PRIi64/PRIu64 | int64_t/uint64_t | %lld/%llu | | PRIiMAX/PRIuMAX | intmax_t/uintmax_t | %jd/%ju |

  • <stdint.h> 为 C 语言带来了:
    • 精确的位宽控制
    • 更好的跨平台兼容性
    • 更安全的数值操作

unistd

  • 进程控制

    • fork
    • exec
    • unsigned int sleep(unsigned int seconds);
  • 文件操作

    • ssize_t read(int fildes, void *buf, size_t nbyte);
      • 共享偏移量
    • ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
      • 指定偏移量,线程安全
    • ssize_t write(int fildes, const void *buf, size_t nbyte);
    • ssize_t pwrite(int fildes, const void *buf, size_t nbyte);
    • int clos(int fildes);
  • 管道操作

    • int pipe(int fildes[2]);
      • 创建匿名管道
      • [0]读
      • [1]写
      • 0 成功 -1 失败
  • uid_t getuid(void);

    • 获取用户真实uid
  • 目录操作

    • int chdir(const char *path);
      • 切换工作目录
      • 0 成功 -1 失败
    • char *getcwd(char buf[.size], size_t size);
  • 程序睡眠

    • unsigned int sleep(unsigned int seconds);//单位s
    • int usleep(useconds_t usec);//微秒
  • 其他

    • int dup(int fildes);
    • int dup2(int fildes, int fildes2);
      • 复制文件描述符
    • int isatty(int fd);
      • 检查文件描述符是否关联到终端

cstring

strcpy(buf1, "hello");		// 用后面的字符串覆盖前面的字符串
strncpy(buf1, "hello", 5);	// 增加指定长度
strcat(buf1, "hello");		// 连接字符串
strncat(buf1, "hello", 5);
strcmp(buf1, "hello");		// 比较字符串,相等返回0
strlen(buf1);				// 返回长度,不包括'\0'
strstr(buf1, "hello");		// 返回第一次出现子串的指针
strtok(buf1, " ");			// 分割字符串,返回分割过的字符串

内存操作函数不检测EOF,不同于str类函数

  • memset(buf1, 0, sizeof(buf1)):覆写内存块
  • memcpy(buf1, "hello", 5):复制内存块,不处理内存重叠
  • memmove(buf1 + 1, buf1, 4):移动5个字节到前一个位置,可处理重叠
  • int memcmp(const void *ptr1, const void *ptr2, size_t num);:比较函数,返回0表示相等