12.18 脚本网页 C标准库

综合了两个官方文档,AI重新梳理了一下C标准库 「最小子集」

博主为了方便大家查阅,做成了离线网页,下面是内容

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>C 标准库参考手册</title>
    <script src="A.插件_字体缩放.js"></script>
<style>
:root {
    --primary-color: #10b981;
    --secondary-color: #06b6d4;
    --accent-color: #8b5cf6;
    --text-color: #1e293b;
    --text-secondary: #64748b;
    --bg-color: #f0fdf4;
    --border-color: #d1fae5;
    --hover-bg: #dcfce7;
    --code-bg: #ffffff;
    --tree-line: #86efac;
    --view-button-bg: #d1fae5;
    --view-button-hover: #a7f3d0;
    --view-button-active: #059669;
    --view-button-text: #064e3b;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;
    font-size: 13px;
    line-height: 1.5;
    color: var(--text-color);
    background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 50%, #d1fae5 100%);
    overflow: hidden;
    height: 100vh;
    width: 100vw;
    display: flex;
    flex-direction: column;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
}

.container {
    flex: 1;
    display: flex;
    flex-direction: column;
    background-color: rgba(255, 255, 255, 0.95);
    overflow: hidden;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
    margin: 8px;
    border-radius: 8px;
    border: 1px solid rgba(209, 250, 229, 0.3);
}

header {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: #fff;
    padding: 12px 16px;
    text-align: left;
    border-bottom: 1px solid rgba(255, 255, 255, 0.2);
    flex-shrink: 0;
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

header::after {
    content: '';
    position: absolute;
    top: 0;
    left: -100%;
    width: 100%;
    height: 100%;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent);
    animation: shimmer 3s infinite;
}

@keyframes shimmer {
    0% { left: -100%; }
    100% { left: 100%; }
}

.header-content {
    display: flex;
    flex-direction: column;
    justify-content: center;
    flex: 1;
}

header h1 {
    font-size: 18px;
    font-weight: 600;
    margin-bottom: 4px;
    position: relative;
}

header p {
    opacity: 0.9;
    font-size: 12px;
    position: relative;
}

.header-search {
    position: relative;
    z-index: 10;
}

#searchInput {
    padding: 6px 10px;
    border: 1px solid var(--border-color);
    border-radius: 6px;
    background-color: rgba(240, 253, 244, 0.8);
    color: var(--text-color);
    font-size: 12px;
    font-family: inherit;
    width: 180px;
    transition: all 0.3s;
}

#searchInput:focus {
    outline: none;
    border-color: var(--accent-color);
    background: rgba(255, 255, 255, 0.95);
    box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.2);
}

.controls {
    padding: 10px 16px;
    background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);
    border-bottom: 1px solid var(--border-color);
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    flex-shrink: 0;
}

.action-buttons {
    display: flex;
    gap: 8px;
}

.controls button {
    background: linear-gradient(135deg, var(--accent-color), var(--secondary-color));
    color: white;
    border: none;
    padding: 6px 12px;
    border-radius: 6px;
    cursor: pointer;
    transition: all 0.3s;
    font-size: 12px;
    font-family: inherit;
    font-weight: 500;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.controls button:hover {
    background: linear-gradient(135deg, var(--secondary-color), var(--primary-color));
    transform: translateY(-1px);
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}

.tree-container {
    flex: 1;
    padding: 12px;
    overflow: auto;
    background: linear-gradient(180deg, rgba(240, 253, 244, 0.4) 0%, rgba(240, 253, 244, 0.2) 100%);
}

.tree-container::-webkit-scrollbar {
    width: 6px;
}

.tree-container::-webkit-scrollbar-thumb {
    background: var(--accent-color);
    border-radius: 3px;
}

.tree ul {
    list-style-type: none;
    padding-left: 16px;
    margin: 0;
}

.tree li {
    position: relative;
    padding: 1px 0;
    white-space: nowrap;
}

.tree li::before {
    content: "";
    position: absolute;
    left: -10px;
    top: 8px;
    width: 10px;
    height: 1px;
    background-color: var(--tree-line);
}

.tree li::after {
    content: "";
    position: absolute;
    left: -10px;
    top: -2px;
    width: 1px;
    height: 100%;
    background-color: var(--tree-line);
}

.tree li:last-child::after {
    height: 10px;
}

.tree > ul > li::before, .tree > ul > li::after {
    display: none;
}

.tree-node {
    display: flex;
    align-items: center;
    cursor: pointer;
    padding: 2px 4px;
    border-radius: 4px;
    transition: all 0.2s;
}

.tree-node:hover {
    background: linear-gradient(135deg, rgba(16, 185, 129, 0.08) 0%, rgba(6, 182, 212, 0.05) 100%);
    transform: translateX(2px);
}

.tree-node .toggle {
    color: #94a3b8;
    margin-right: 3px;
    font-size: 9px;
    transition: transform 0.2s;
}

.tree-node .icon {
    margin-right: 6px;
    font-size: 12px;
}

.tree-node .folder {
    color: var(--primary-color);
}

.tree-node .file {
    color: var(--text-secondary);
}

.tree-content {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    min-width: 0;
}

.tree-name {
    font-weight: 500;
    font-size: 13px;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--text-color);
}

.tree-desc {
    font-style: normal !important;
    white-space: normal !important;
    max-width: none !important;
    overflow: visible !important;
    text-overflow: unset !important;
    display: inline-block !important;
    line-height: 1.4 !important;
    margin-top: 2px !important;
    font-size: 11px !important;
    color: var(--text-secondary) !important;
    background: rgba(16, 185, 129, 0.06) !important;
    padding: 1px 4px !important;
    border-radius: 3px !important;
    border: 1px solid rgba(16, 185, 129, 0.1) !important;
    transition: all 0.2s !important;
}

.tree-node:hover .tree-desc {
    background: rgba(16, 185, 129, 0.1) !important;
    border-color: rgba(16, 185, 129, 0.2) !important;
}

.collapsed > ul {
    display: none;
}

.highlight {
    background: linear-gradient(135deg, var(--accent-color), var(--secondary-color));
    padding: 0 3px;
    border-radius: 3px;
    color: #fff;
    font-weight: 500;
}

footer {
    background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
    color: white;
    padding: 8px 16px;
    text-align: center;
    font-size: 10px;
    border-top: 1px solid rgba(255, 255, 255, 0.2);
    flex-shrink: 0;
}

@media (max-width: 768px) {
    body { font-size: 12px; }
    .container { margin: 4px; }
    header h1 { font-size: 16px; }
    header p { font-size: 11px; }
    .tree ul { padding-left: 14px; }
    .tree-name { font-size: 12px; }
    .tree-desc { font-size: 10px; }
    #searchInput { width: 140px; font-size: 11px; }
    .controls button { font-size: 11px; padding: 5px 10px; }
}

@media (max-width: 480px) {
    body { font-size: 11px; }
    .container { margin: 2px; }
    header h1 { font-size: 14px; }
    header p { font-size: 10px; }
    .tree ul { padding-left: 12px; }
    .tree-node { padding: 1px 3px; }
    .tree-name { font-size: 11px; }
    .tree-desc { font-size: 9px; }
    #searchInput { width: 120px; font-size: 10px; }
    .controls button { font-size: 10px; padding: 4px 8px; }
}
</style>
</head>
<body>
<div class="container">
    <header>
        <div class="header-content">
            <h1>C 标准库参考手册</h1>
            <p>C Standard Library Reference Manual (2025-12-18)</p>
        </div>
        <div class="header-search">
            <input type="text" id="searchInput" placeholder="搜索函数或常量...">
        </div>
    </header>
    <div class="controls">
        <div class="action-buttons">
            <button id="expandAll">展开全部</button>
            <button id="collapseAll">折叠全部</button>
        </div>
    </div>
    <div class="tree-container">
        <div class="tree" id="treeContainer"></div>
    </div>
    <footer>
        <p>© 2025 C 标准库参考手册 | Generated by 凉安</p>
    </footer>
</div>

<!-- 数据部分 -->
<script>
// C 标准库树形数据
// 返回 NULL 并非"没结果",可能指针传递信息。
const cLibraryData = [
    {
        name: "一、assert.h,诊断",
        type: "folder",
        children: [
            { name: "1. void assert(int exp)", desc: "验证程序假设,失败时终止程序", type: "file" }
        ]
    },
    {
        name: "二、ctype.h,字符处理函数",
        type: "folder",
        children: [
            { name: "1. int isalnum(int c)", desc: "检查字符是否为字母或数字", type: "file" },
            { name: "2. int isalpha(int c)", desc: "检查字符是否为字母", type: "file" },
            { name: "3. int iscntrl(int c)", desc: "检查字符是否为控制字符", type: "file" },
            { name: "4. int isdigit(int c)", desc: "检查字符是否为十进制数字", type: "file" },
            { name: "5. int isgraph(int c)", desc: "检查字符是否有图形表示法", type: "file" },
            { name: "6. int islower(int c)", desc: "检查字符是否为小写字母", type: "file" },
            { name: "7. int isprint(int c)", desc: "检查字符是否为可打印字符", type: "file" },
            { name: "8. int ispunct(int c)", desc: "检查字符是否为标点符号", type: "file" },
            { name: "9. int isspace(int c)", desc: "检查字符是否为空白字符", type: "file" },
            { name: "10. int isupper(int c)", desc: "检查字符是否为大写字母", type: "file" },
            { name: "11. int isxdigit(int c)", desc: "检查字符是否为十六进制数字", type: "file" },
            { name: "12. int tolower(int c)", desc: "将大写字母转换为小写字母", type: "file" },
            { name: "13. int toupper(int c)", desc: "将小写字母转换为大写字母", type: "file" }
        ]
    },
    {
        name: "三、float.h,浮点型限制",
        type: "folder",
        children: [
            { name: "1. int FLT_RADIX", desc: "指数表示的基数(最小值2)", type: "file" },
            { name: "2. int FLT_ROUNDS", desc: "加法的浮点舍入规则", type: "file" },
            { name: "3. int FLT_MANT_DIG", desc: "基数为FLT_RADIX 的尾数中的数字数", type: "file" },
            { name: "4. int FLT_MAX_EXP", desc: "使FLT_RADIX^n-1 可表示的最大n", type: "file" },
            { name: "5. int FLT_MIN_EXP", desc: "使10^n 为规范化数的最小n", type: "file" },
            { name: "6. int DBL_MANT_DIG", desc: "基数为FLT_RADIX 的尾数中的数字数", type: "file" },
            { name: "7. int DBL_MAX_EXP", desc: "使FLT_RADIX^n-1 可表示的最大n", type: "file" },
            { name: "8. int DBL_MIN_EXP", desc: "使10^n 为规范化数的最小n", type: "file" },
            { name: "9. float FLT_DIG", desc: "float 类型精度 (最小值6) ", type: "file" },
            { name: "10. float FLT_EPSILON", desc: "使1.0 + x != 1.0 成立的最小x(最小值1E-5)", type: "file" },
            { name: "11. float FLT_MAX", desc: "最大浮点数(最小值1E+37)", type: "file" },
            { name: "12. float FLT_MIN", desc: "最小的规范化浮点数(最小值1E-37)", type: "file" },
            { name: "13. double DBL_DIG", desc: "double 类型精度(最小值10)", type: "file" },
            { name: "14. double DBL_EPSILON", desc: "使1.0 + x != 1.0 成立的最小x(最小值1E-9)", type: "file" },
            { name: "15. double DBL_MAX", desc: "最大双精度浮点数(最小值1E+37)", type: "file" },
            { name: "16. double DBL_MIN", desc: "最小的规范化双精度浮点数(最小值1E-37)", type: "file" }
        ]
    },
    {
        name: "四、limits.h,整型限制",
        type: "folder",
        children: [
            { name: "1. int CHAR_BIT", desc: "char 类型的位数(最小值8)", type: "file" },
            { name: "2. int CHAR_MAX", desc: "char 类型的最大值", type: "file" },
            { name: "3. int CHAR_MIN", desc: "char 类型的最小值", type: "file" },
            { name: "4. int INT_MAX", desc: "int 类型的最大值 (最小值32767)", type: "file" },
            { name: "5. int INT_MIN", desc: "int 类型的最小值 (最小值-32767)", type: "file" },
            { name: "6. long LONG_MAX", desc: "long 类型的最大值(最小值2147483647)", type: "file" },
            { name: "7. long LONG_MIN", desc: "long 类型的最小值(最小值-2147483647)", type: "file" },
            { name: "8. int SCHAR_MAX", desc: "signed char 的最大值(最小值127)", type: "file" },
            { name: "9. int SCHAR_MIN", desc: "signed char 的最小值(最小值-127)", type: "file" },
            { name: "10. int SHRT_MAX", desc: "short 的最大值(最小值32767)", type: "file" },
            { name: "11. int SHRT_MIN", desc: "short 的最小值(最小值-32767)", type: "file" },
            { name: "12. unsigned int UCHAR_MAX", desc: "unsigned char 的最大值(最小值255)", type: "file" },
            { name: "13. unsigned int UINT_MAX", desc: "unsigned int 的最大值(最小值65535)", type: "file" },
            { name: "14. unsigned long ULONG_MAX", desc: "unsigned long 的最大值(最小值4294967295)", type: "file" },
            { name: "15. unsigned int USHRT_MAX", desc: "unsigned short 的最大值(最小值65535)", type: "file" }
        ]
    },
    {
        name: "五、locale.h,地域化设置",
        type: "folder",
        children: [
            { name: "1. char* setlocale(int category, const char* locale)", desc: "设置或读取地域化信息", type: "file" },
            { name: "2. struct lconv *localeconv(void)", desc: "获取地域化信息(如货币符号)", type: "file" }
        ]
    },
    {
        name: "六、math.h,数学函数库",
        type: "folder",
        children: [
            { name: "1. double acos(double x)", desc: "返回以弧度表示的x 的反余弦", type: "file" },
            { name: "2. double asin(double x)", desc: "返回以弧度表示的x 的反正弦", type: "file" },
            { name: "3. double atan(double x)", desc: "返回以弧度表示的x 的反正切", type: "file" },
            { name: "4. double atan2(double y, double x)", desc: "返回以弧度表示的y/x 的反正切,y 和x 的符号决定象限", type: "file" },
            { name: "5. double cos(double x)", desc: "返回弧度角x 的余弦", type: "file" },
            { name: "6. double cosh(double x)", desc: "返回x 的双曲余弦", type: "file" },
            { name: "7. double sin(double x)", desc: "返回弧度角x 的正弦", type: "file" },
            { name: "8. double sinh(double x)", desc: "返回x 的双曲正弦", type: "file" },
            { name: "9. double tanh(double x)", desc: "返回x 的双曲正切", type: "file" },
            { name: "10. double exp(double x)", desc: "返回e 的x 次幂的值", type: "file" },
            { name: "11. double frexp(double x, int *exponent)", desc: "分解浮点数x 为尾数和指数,返回尾数,指数存入exponent", type: "file" },
            { name: "12. double ldexp(double x, int exponent)", desc: "返回x 乘以2 的exponent 次幂", type: "file" },
            { name: "13. double log(double x)", desc: "返回x 的自然对数(基数为e)", type: "file" },
            { name: "14. double log10(double x)", desc: "返回x 的常用对数(基数为10)", type: "file" },
            { name: "15. double modf(double x, double *integer)", desc: "返回小数部分,并设置integer 为整数部分", type: "file" },
            { name: "16. double pow(double x, double y)", desc: "返回x的y 次幂", type: "file" },
            { name: "17. double sqrt(double x)", desc: "返回x 的平方根", type: "file" },
            { name: "18. double ceil(double x)", desc: "返回大于或等于x的最小整数值", type: "file" },
            { name: "19. double fabs(double x)", desc: "返回x 的绝对值", type: "file" },
            { name: "20. double floor(double x)", desc: "返回小于或等于x的最大整数值", type: "file" },
            { name: "21. double fmod(double x, double y)", desc: "返回x 除以y 的余数", type: "file" }
        ]
    },
    {
        name: "七、setjmp.h,非局部跳转",
        type: "folder",
        children: [
            { name: "1. void longjmp(jmp_buf environment, int value)", desc: "恢复由setjmp 保存的环境", type: "file" },
            { name: "2. int setjmp(jmp_buf env)", desc: "保存当前执行环境", type: "file" }
        ]
    },
    {
        name: "八、signal.h,信号处理",
        type: "folder",
        children: [
            { name: "1. void (*signal(int sig, void (*func)(int)))(int)", desc: "设置信号处理函数", type: "file" },
            { name: "2. int raise(int sig)", desc: "生成指定信号", type: "file" }
        ]
    },
    {
        name: "九、stdarg.h,变长参数",
        type: "folder",
        children: [
            { name: "1. void va_start(va_list ap, lastarg)", desc: "初始化可变参数列表", type: "file" },
            { name: "2. void va_end(va_list ap)", desc: "清理可变参数列表", type: "file" },
            { name: "3. type va_arg(va_list ap, type)", desc: "获取下一个可变参数", type: "file" }
        ]
    },
    {
        name: "十、stdio.h,输入输出函数",
        type: "folder",
        children: [
            { name: "1. void clearerr(FILE *stream)", desc: "清除文件流的错误标识符", type: "file" },
            { name: "2. void perror(const char* str)", desc: "输出错误描述到标准错误", type: "file" },
            { name: "3. void rewind(FILE *stream)", desc: "重置文件位置到开头", type: "file" },
            { name: "4. void setbuf(FILE *stream, char* buffer)", desc: "设置文件缓冲区", type: "file" },
            { name: "5. int fclose(FILE *stream)", desc: "关闭文件流", type: "file" },
            { name: "6. int feof(FILE *stream)", desc: "测试文件结束标识符", type: "file" },
            { name: "7. int ferror(FILE *stream)", desc: "测试文件流的错误标识符", type: "file" },
            { name: "8. int fflush(FILE *stream)", desc: "刷新输出缓冲区", type: "file" },
            { name: "9. int fgetpos(FILE *stream, fpos_t *pos)", desc: "获取文件当前位置", type: "file" },
            { name: "10. int fsetpos(FILE *stream, const fpos_t *pos)", desc: "设置文件位置", type: "file" },
            { name: "11. int fseek(FILE *stream, long int offset, int whence)", desc: "设置文件位置", type: "file" },
            { name: "12. int remove(const char* filename)", desc: "删除文件", type: "file" },
            { name: "13. int rename(const char* old_filename, const char* new_filename)", desc: "重命名文件", type: "file" },
            { name: "14. int setvbuf(FILE *stream, char* buffer, int mode, size_t size)", desc: "设置文件缓冲模式", type: "file" },
            { name: "15. int ungetc(int char, FILE *stream)", desc: "将字符推回文件流", type: "file" },
            { name: "16. long int ftell(FILE *stream)", desc: "返回当前文件位置", type: "file" },
            { name: "17. FILE *fopen(const char* filename, const char* mode)", desc: "打开文件", type: "file" },
            { name: "18. FILE *freopen(const char* filename, const char* mode, FILE *stream)", desc: "重新打开文件流", type: "file" },
            { name: "19. FILE *tmpfile(void)", desc: "创建临时文件", type: "file" },
            { name: "20. char* fgets(char* str, int n, FILE *stream)", desc: "从文件流读取一行", type: "file" },
            { name: "21. char* tmpnam(char* str)", desc: "生成唯一临时文件名", type: "file" },
            { name: "22. size_t fread(void* ptr, size_t size, size_t nmemb, FILE *stream)", desc: "从文件读取数据", type: "file" },
            { name: "23. size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE *stream)", desc: "向文件写入数据", type: "file" },
            { name: "24. int fprintf(FILE *stream, const char* format, ...)", desc: "格式化输出到文件流", type: "file" },
            { name: "25. int printf(const char* format, ...)", desc: "格式化输出到标准输出", type: "file" },
            { name: "26. int sprintf(char* str, const char* format, ...)", desc: "格式化输出到字符串", type: "file" },
            { name: "27. int vfprintf(FILE *stream, const char* format, va_list arg)", desc: "使用参数列表格式化输出到文件流", type: "file" },
            { name: "28. int vprintf(const char* format, va_list arg)", desc: "使用参数列表格式化输出到标准输出", type: "file" },
            { name: "29. int vsprintf(char* str, const char* format, va_list arg)", desc: "使用参数列表格式化输出到字符串", type: "file" },
            { name: "30. int snprintf(char* buf, size_t num, const char* format, ...)", desc: "安全格式化输出到字符串", type: "file" },
            { name: "31. int vsnprintf(char* buf, size_t num, const char* format, va_list arg)", desc: "安全可变参数格式化输出", type: "file" },
            { name: "32. int fscanf(FILE *stream, const char* format, ...)", desc: "从文件流读取格式化输入", type: "file" },
            { name: "33. int scanf(const char* format, ...)", desc: "从标准输入读取格式化输入", type: "file" },
            { name: "34. int sscanf(const char* str, const char* format, ...)", desc: "从字符串读取格式化输入", type: "file" },
            { name: "35. int fgetc(FILE *stream)", desc: "从文件流读取单个字符", type: "file" },
            { name: "36. int getc(FILE *stream)", desc: "从文件流读取单个字符", type: "file" },
            { name: "37. int getchar(void)", desc: "从标准输入读取单个字符", type: "file" },
            { name: "38. int fputc(int char, FILE *stream)", desc: "写入字符到文件流", type: "file" },
            { name: "39. int putc(int char, FILE *stream)", desc: "写入字符到文件流", type: "file" },
            { name: "40. int putchar(int char)", desc: "写入字符到标准输出", type: "file" },
            { name: "41. int fputs(const char* str, FILE *stream)", desc: "写入字符串到文件流", type: "file" },
            { name: "42. int puts(const char* str)", desc: "写入字符串到标准输出", type: "file" },
            { name: "43. int gets(char* str)", desc: "从标准输入读取一行(已弃用)", type: "file" }
        ]
    },
    {
        name: "十一、stdlib.h,标准库函数",
        type: "folder",
        children: [
            { name: "1. void abort(void)", desc: "使程序异常终止", type: "file" },
            { name: "2. void exit(int status)", desc: "使程序正常终止", type: "file" },
            { name: "3. void free(void* ptr)", desc: "释放之前分配的内存空间", type: "file" },
            { name: "4. void qsort(void* base, size_t nitems, size_t size, int (*compar)(const void* , const void*))", desc: "数组排序", type: "file" },
            { name: "5. void srand(unsigned int seed)", desc: "初始化随机数发生器", type: "file" },
            { name: "6. int atoi(const char* str)", desc: "将字符串转换为int 类型整数", type: "file" },
            { name: "7. int atexit(void (*func)(void))", desc: "程序正常终止时调用指定函数", type: "file" },
            { name: "8. int mblen(const char* str, size_t n)", desc: "返回多字节字符的长度", type: "file" },
            { name: "9. int mbtowc(whcar_t *pwc, const char* str, size_t n)", desc: "检查多字节字符", type: "file" },
            { name: "10. int rand(void)", desc: "返回0 到RAND_MAX 之间的伪随机数", type: "file" },
            { name: "11. int system(const char* string)", desc: "执行系统命令", type: "file" },
            { name: "12. int wctomb(char* str, wchar_t wchar)", desc: "检查宽字符的多字节编码", type: "file" },
            { name: "13. long atol(const char* str)", desc: "将字符串转换为long int 类型长整数", type: "file" },
            { name: "14. int abs(int x)", desc: "返回x 的绝对值", type: "file" },
            { name: "15. long labs(long int x)", desc: "返回x 的绝对值", type: "file" },
            { name: "16. double atof(const char* str)", desc: "将字符串转换为double 类型浮点数", type: "file" },
            { name: "17. div_t div(int numer, int denom)", desc: "分子除以分母", type: "file" },
            { name: "18. ldiv_t ldiv(long int numer, long int denom)", desc: "分子除以分母", type: "file" },
            { name: "19. char* getenv(const char* name)", desc: "搜索环境字符串并返回相关值", type: "file" },
            { name: "20. void* calloc(size_t nitems, size_t size)", desc: "分配内存空间并返回指针", type: "file" },
            { name: "21. void* malloc(size_t size)", desc: "分配内存空间并返回指针", type: "file" },
            { name: "22. void* realloc(void* ptr, size_t size)", desc: "重新调整内存块大小", type: "file" },
            { name: "23. void* bsearch(const void* key, const void* base, size_t nitems, size_t size, int (*compar)(const void* , const void* ))", desc: "执行二分查找", type: "file" },
            { name: "24. double strtod(const char* str, char* *endptr)", desc: "将字符串转换为double 类型浮点数", type: "file" },
            { name: "25. long strtol(const char* str, char* *endptr, int base)", desc: "将字符串转换为long int 类型长整数", type: "file" },
            { name: "26. unsigned long strtoul(const char* str, char* *endptr, int base)", desc: "将字符串转换为unsigned long int 类型无符号长整数", type: "file" },
            { name: "27. size_t mbstowcs(schar_t *pwcs, const char* str, size_t n)", desc: "将多字节字符串转换为宽字符数组", type: "file" },
            { name: "28. size_t wcstombs(char* str, const wchar_t *pwcs, size_t n)", desc: "将宽字符数组转换为多字节字符串", type: "file" }
        ]
    },
    {
        name: "十二、string.h,字符串处理函数 ❤",
        type: "folder",
        children: [
            { name: "1. void* memchr(const void* str, int c, size_t n)", desc: "在字符串中搜索字符首次出现的位置", type: "file" },
            { name: "2. void* memcpy(void* dest, const void* src, size_t n)", desc: "复制n 个字符从src 到dest", type: "file" },
            { name: "3. void* memmove(void* dest, const void* src, size_t n)", desc: "复制n 个字符(处理重叠)", type: "file" },
            { name: "4. void* memset(void* str, int c, size_t n)", desc: "将字符c 复制到字符串前n 个字符", type: "file" },
            { name: "5. char* strcat(char* dest, const char* src)", desc: "追加字符串src 到dest 末尾", type: "file" },
            { name: "6. char* strncat(char* dest, const char* src, size_t n)", desc: "追加src 的前n 个字符到dest", type: "file" },
            { name: "7. char* strchr(const char* str, int c)", desc: "在字符串中搜索字符首次出现的位置", type: "file" },
            { name: "8. char* strcpy(char* dest, const char* src)", desc: "复制字符串src 到dest", type: "file" },
            { name: "9. char* strncpy(char* dest, const char* src, size_t n)", desc: "复制src 的前n 个字符到dest", type: "file" },
            { name: "10. char* strerror(int errnum)", desc: "返回错误码对应的错误消息字符串", type: "file" },
            { name: "11. char* strpbrk(const char* str1, const char* str2)", desc: "在str1 中查找str2 中任意字符首次出现的位置", type: "file" },
            { name: "12. char* strrchr(const char* str, int c)", desc: "在字符串中搜索字符最后一次出现的位置", type: "file" },
            { name: "13. char* strstr(const char* haystack, const char* needle)", desc: "在字符串中查找子串首次出现的位置", type: "file" },
            { name: "14. char* strtok(char* str, const char* delim)", desc: "分解字符串为标记序列", type: "file" },
            { name: "15. int memcmp(const void* str1, const void* str2, size_t n)", desc: "比较两个字符串的前n 个字节", type: "file" },
            { name: "16. int strcmp(const char* str1, const char* str2)", desc: "比较两个字符串", type: "file" },
            { name: "17. int strncmp(const char* str1, const char* str2, size_t n)", desc: "比较两个字符串的前n 个字符", type: "file" },
            { name: "18. int strcoll(const char* str1, const char* str2)", desc: "根据地域设置比较字符串", type: "file" },
            { name: "19. size_t strcspn(const char* str1, const char* str2)", desc: "返回str1 中不含str2 字符的起始段长度", type: "file" },
            { name: "20. size_t strlen(const char* str)", desc: "返回字符串长度", type: "file" },
            { name: "21. size_t strspn(const char* str1, const char* str2)", desc: "返回str1 中只包含str2 字符的起始段长度", type: "file" },
            { name: "22. size_t strxfrm(char* dest, const char* src, size_t n)", desc: "转换字符串为当前地域的可比较形式", type: "file" }
        ]
    },
    {
        name: "十三、time.h,时间日期函数",
        type: "folder",
        children: [
            { name: "1. char* asctime(const struct tm *timeptr)", desc: "将时间结构转换为字符串", type: "file" },
            { name: "2. char* ctime(const time_t *timer)", desc: "将时间转换为本地时间字符串", type: "file" },
            { name: "3. clock_t clock(void)", desc: "返回程序执行时间", type: "file" },
            { name: "4. double difftime(time_t time1, time_t time2)", desc: "计算两个时间的差值(秒)", type: "file" },
            { name: "5. struct tm *gmtime(const time_t *timer)", desc: "将时间转换为协调世界时(UTC)", type: "file" },
            { name: "6. struct tm *localtime(const time_t *timer)", desc: "将时间转换为本地时间", type: "file" },
            { name: "7. time_t mktime(struct tm *timeptr)", desc: "将时间结构转换为time_t 值", type: "file" },
            { name: "8. time_t time(time_t *timer)", desc: "获取当前日历时间", type: "file" },
            { name: "9. size_t strftime(char* str, size_t maxsize, const char* format, const struct tm *timeptr)", desc: "格式化时间字符串", type: "file" }
        ]
    }
];
</script>


<!-- 图标部分 -->
<script>
// 图标配置
const icons = {
    folder: '📄',
    file: '💦',
    toggle: {
        expanded: '▼',
        collapsed: '▶'
    }
};
</script>

<!-- 逻辑部分 -->
<script>
// 创建树节点的函数
function createTreeNode(data) {
    const li = document.createElement('li');
    
    // 创建节点容器
    const nodeDiv = document.createElement('div');
    nodeDiv.className = 'tree-node';
    
    // 添加折叠图标(仅文件夹)
    if (data.type === 'folder') {
        const toggleIcon = document.createElement('span');
        toggleIcon.className = 'toggle';
        toggleIcon.textContent = icons.toggle.expanded;
        nodeDiv.appendChild(toggleIcon);
    }
    
    // 添加文件夹/文件图标
    const icon = document.createElement('span');
    icon.className = 'icon';
    icon.textContent = data.type === 'folder' ? icons.folder : icons.file;
    icon.classList.add(data.type);
    nodeDiv.appendChild(icon);
    
    // 添加内容区域
    const contentDiv = document.createElement('div');
    contentDiv.className = 'tree-content';
    
    const nameSpan = document.createElement('span');
    nameSpan.className = 'tree-name';
    nameSpan.textContent = data.name;
    contentDiv.appendChild(nameSpan);
    
    if (data.desc) {
        const descSpan = document.createElement('span');
        descSpan.className = 'tree-desc';
        descSpan.textContent = data.desc;
        contentDiv.appendChild(descSpan);
    }
    
    nodeDiv.appendChild(contentDiv);
    li.appendChild(nodeDiv);
    
    // 递归创建子节点
    if (data.children && data.children.length > 0) {
        const ul = document.createElement('ul');
        data.children.forEach(child => {
            ul.appendChild(createTreeNode(child));
        });
        li.appendChild(ul);
    }
    
    return li;
}

// 初始化树形结构
function initTree() {
    const treeContainer = document.getElementById('treeContainer');
    treeContainer.innerHTML = '';
    
    const ul = document.createElement('ul');
    cLibraryData.forEach(item => {
        ul.appendChild(createTreeNode(item));
    });
    treeContainer.appendChild(ul);
    
    // 默认展开第一级文件夹
    const rootUl = treeContainer.querySelector('ul');
    const firstLevelLis = rootUl.querySelectorAll(':scope > li');
    firstLevelLis.forEach(li => {
        // 第一级文件夹默认展开,不添加collapsed 类
            li.classList.add('collapsed'); // 第一级文件夹也默认折叠
    });
    
    // 其他文件夹默认折叠
    document.querySelectorAll('.tree li:has(> ul)').forEach(li => {
        if (li.parentElement.parentElement.id !== 'treeContainer') {
            li.classList.add('collapsed');
            // 更新折叠图标
            const toggle = li.querySelector('.toggle');
            if (toggle) {
                toggle.textContent = icons.toggle.collapsed;
            }
        }
    });
}

// 展开全部
function expandAll() {
    document.querySelectorAll('.tree li.collapsed').forEach(li => {
        li.classList.remove('collapsed');
        // 更新展开图标
        const toggle = li.querySelector('.toggle');
        if (toggle) {
            toggle.textContent = icons.toggle.expanded;
        }
    });
}

// 折叠全部
function collapseAll() {
    document.querySelectorAll('.tree li:has(.icon.folder)').forEach(li => {
        if (!li.parentElement.classList.contains('tree')) {
            li.classList.add('collapsed');
            // 更新折叠图标
            const toggle = li.querySelector('.toggle');
            if (toggle) {
                toggle.textContent = icons.toggle.collapsed;
            }
        }
    });
}

// 搜索功能
function searchTree(term) {
    // 清除之前的高亮
    document.querySelectorAll('.highlight').forEach(el => {
        el.classList.remove('highlight');
    });
    
    if (term === '') return;
    
    // 搜索并高亮匹配项
    document.querySelectorAll('.tree-node').forEach(node => {
        const text = node.textContent.toLowerCase();
        if (text.includes(term)) {
            node.querySelector('.tree-name').classList.add('highlight');
            
            // 展开父节点
            let parent = node.closest('li');
            while (parent && !parent.classList.contains('tree')) {
                parent.classList.remove('collapsed');
                // 更新展开图标
                const toggle = parent.querySelector('.toggle');
                if (toggle) {
                    toggle.textContent = icons.toggle.expanded;
                }
                parent = parent.parentElement.closest('li');
            }
        }
    });
}

// 初始化
document.addEventListener('DOMContentLoaded', function() {
    initTree();
    
    // 展开全部按钮
    document.getElementById('expandAll').addEventListener('click', expandAll);
    
    // 折叠全部按钮
    document.getElementById('collapseAll').addEventListener('click', collapseAll);
    
    // 搜索功能
    document.getElementById('searchInput').addEventListener('input', function(e) {
        searchTree(e.target.value.toLowerCase());
    });
    
    // 折叠/展开功能
    document.getElementById('treeContainer').addEventListener('click', function(e) {
        const treeNode = e.target.closest('.tree-node');
        if (!treeNode) return;
        
        const folder = treeNode.querySelector('.icon.folder');
        if (!folder) return;
        
        const li = treeNode.parentElement;
        li.classList.toggle('collapsed');
        
        // 更新图标
        const toggle = treeNode.querySelector('.toggle');
        if (toggle) {
            toggle.textContent = li.classList.contains('collapsed') 
                ? icons.toggle.collapsed 
                : icons.toggle.expanded;
        }
    });
});
</script>
</body>
</html>
相关推荐
A13247053122 小时前
Linux文件查找:find和locate命令入门
linux·运维·服务器·网络·chrome
峥嵘life2 小时前
Android16 EDLA 认证测试BTS过程介绍
android·java·linux
Sleepy MargulisItG2 小时前
【Linux网络编程】传输层协议:UDP
linux·服务器·网络·udp
weixin_436525074 小时前
Linux 终端下的 My Sql 常用操作指南(替代 Navicat)
linux·运维·服务器
wenchm11 小时前
细说STM32H743XIH6单片机通过FMC访问片外NAND Flash的方法及实例
stm32·单片机·嵌入式硬件
@good_good_study11 小时前
STM32 定时器PWM配置函数及实验
stm32·单片机
南棱笑笑生12 小时前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
三佛科技-1341638421212 小时前
KP32511SGA固定12V输出小家电电源芯片 典型应用电路
单片机·嵌入式硬件
xingzhemengyou113 小时前
STM32启动流程
stm32·单片机·嵌入式硬件