C 标准库总结

C 标准库总览表

下表按功能类别列出了常用头文件。您可根据需求先在表中找到相应功能与头文件,再查看后续的示例与注意事项。

功能类别头文件主要功能/特性常用函数例子
标准输入输出(I/O)<stdio.h>标准输入输出、文件操作printf(), scanf(), fopen(), fgets(), fprintf()
内存与工具函数<stdlib.h>内存分配、程序退出、转换函数、随机数malloc(), free(), exit(), atoi(), strtol(), rand()
字符串与内存操作<string.h>字符串处理、内存块操作strlen(), strcpy(), strncpy(), strcat(), memcmp()
字符分类与转换<ctype.h>字符分类检查与大小写转换isalpha(), isdigit(), isspace(), toupper(), tolower()
时间与日期<time.h>获取系统时间、格式化日期时间、计时time(), localtime(), gmtime(), strftime(), clock()
数学函数<math.h>基本数学运算与函数sin(), cos(), tan(), log(), sqrt(), pow()
错误处理与断言<errno.h>, <assert.h>错误码 errno 与断言调试辅助assert(), perror(), strerror()
类型限制与定长整数<limits.h>, <float.h>, <stdint.h>, <inttypes.h>基本类型范围、浮点限制、定长整数类型及格式化宏INT_MAX, DBL_MAX, int32_t, PRId32
布尔类型支持<stdbool.h>布尔类型 bool, true, false(无函数,仅宏与类型定义)
本地化与宽字符支持<locale.h>, <wchar.h>, <wctype.h>, <uchar.h>地域化设置、宽字符与Unicode支持setlocale(), wprintf(), iswalpha()
信号与非局部跳转<signal.h>, <setjmp.h>信号处理与非局部跳转signal(), raise(), setjmp(), longjmp()
可变参数处理<stdarg.h>可变参数函数支持(如实现printf风格函数)va_list, va_start(), va_arg(), va_end()
原子与多线程(C11)<stdatomic.h>, <threads.h>原子操作、多线程API(C11引入)atomic_store(), thrd_create(), thrd_join(), mtx_lock()
对齐与不可返回函数(C11)<stdalign.h>, <stdnoreturn.h>内存对齐与不可返回函数说明alignof(), _Noreturn关键字
复数与特殊数学(C99)<complex.h>, <fenv.h>, <tgmath.h>复数操作、浮点环境控制、类型泛型数学宏cabs(), fesetround(), 使用tgm宏自动选择数学函数版本

深入示例与注意事项

1. 标准输入输出(<stdio.h>)

典型场景:文件读写、标准输入输出、格式化打印。

示例:将文本写入文件并读出

#include <stdio.h>
#include <stdlib.h>int main() {FILE *fp = fopen("data.txt", "w");if (!fp) {perror("Open for writing failed");return EXIT_FAILURE;}fprintf(fp, "Hello, world!\n");fclose(fp);fp = fopen("data.txt", "r");if (!fp) {perror("Open for reading failed");return EXIT_FAILURE;}char buf[100];if (fgets(buf, sizeof(buf), fp)) {printf("Read: %s", buf);}fclose(fp);return 0;
}

注意事项

  • 使用 fgets() 而非 gets() 来避免缓冲区溢出。
  • 打开文件后需记得 fclose()
  • 格式化输出时,确保格式说明符匹配传入参数类型。

2. 内存分配与通用工具(<stdlib.h>)

典型场景:动态分配数组,转换字符串为数值,生成随机数。

示例:动态分配与随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main() {int *arr = malloc(5 * sizeof(int));if (!arr) {fprintf(stderr, "malloc failed\n");return EXIT_FAILURE;}for (int i = 0; i < 5; i++) arr[i] = i*i;srand((unsigned)time(NULL));int r = rand() % 100;printf("Random: %d\n", r);free(arr);return 0;
}

注意事项

  • 每次 malloc()/calloc() 分配的内存必须 free()
  • 对转换类函数如 atoi(),若需严谨错误检测,用 strtol()替代。

3. 字符串与内存(<string.h>)

典型场景:字符串复制、拼接、比较,内存块拷贝清零。

示例:安全字符串拷贝与搜索

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello C";char dest[20];// 使用strncpy以避免溢出,并手动添加'\0'strncpy(dest, src, sizeof(dest)-1);dest[sizeof(dest)-1] = '\0';printf("Copied: %s\n", dest);char *pos = strstr(dest, "C");if (pos) {printf("Found 'C' at index %ld\n", pos - dest);}return 0;
}

注意事项

  • 始终确保目标缓冲区足够大,并在需要时手动添加终止符'\0'
  • 对二进制数据用 memcpy()/memmove() 而非 strcpy()

4. 字符类型检查(<ctype.h>)

典型场景:判断字符是否字母、数字,转换大小写。

示例

#include <stdio.h>
#include <ctype.h>int main() {char c = '9';if (isdigit((unsigned char)c)) {printf("%c is a digit\n", c);}c = 'a';printf("Uppercase: %c\n", toupper((unsigned char)c));return 0;
}

注意事项

  • char转为unsigned char传给isxxx()函数,以避免负值出现未定义行为。

5. 时间与日期(<time.h>)

典型场景:获取当前时间、格式化输出、统计运行时间。

示例:打印当前时间

#include <stdio.h>
#include <time.h>int main() {time_t now = time(NULL);struct tm *lt = localtime(&now);char buf[100];strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", lt);printf("Local time: %s\n", buf);return 0;
}

注意事项

  • localtime()返回静态存储区指针,下次调用会覆盖,使用前若需保存结果请复制数据。
  • C标准不提供复杂日期处理,需要自行处理闰年等逻辑或使用第三方库。

6. 数学函数(<math.h>)

典型场景:计算三角函数、对数、指数、开方、幂。

示例:计算圆面积

#include <stdio.h>
#include <math.h>int main() {double radius = 2.0;double area = M_PI * pow(radius, 2);printf("Area: %f\n", area);return 0;
}

注意事项

  • 确保定义 _USE_MATH_DEFINES(在某些编译器中)或自己定义PI来使用M_PI
  • 浮点精度有限,比较时需考虑误差。

7. 错误处理与断言(<errno.h>, <assert.h>)

典型场景:检查函数调用失败原因,调试时检查不变条件。

示例

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <assert.h>int main() {FILE *fp = fopen("nonexist.txt", "r");if (!fp) {fprintf(stderr, "Error: %s\n", strerror(errno));}int x = 10;assert(x == 10); // 若不满足则程序中断return 0;
}

注意事项

  • 发布版本可#define NDEBUG禁用assert()
  • errno只在特定函数失败时有意义。

8. 类型限制与定长整数

典型场景:确定整数范围、使用定长类型确保跨平台一致性。

示例

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <limits.h>int main() {printf("INT_MAX = %d\n", INT_MAX);int32_t val = 12345;printf("val = %" PRId32 "\n", val);return 0;
}

注意事项

  • 使用<stdint.h>确保整数位宽固定。
  • <inttypes.h>提供打印定长整数的安全格式化宏。

9. 布尔与本地化支持(<stdbool.h>, <locale.h>等)

典型场景:使用布尔类型代码更清晰,或设置地域化格式。

示例(布尔类型):

#include <stdio.h>
#include <stdbool.h>int main() {bool flag = true;if (flag) {printf("Flag is true\n");}return 0;
}

示例(locale):

#include <stdio.h>
#include <locale.h>int main() {setlocale(LC_ALL, "");// 输出可能在特定语言环境下启用特殊格式printf("%'.2f\n", 1234567.89); return 0;
}

注意事项

  • 地域化支持依赖系统环境,setlocale()设置地区后相关函数的行为(如数字分组符)才会改变。
  • <wchar.h><wctype.h> 用于宽字符处理,多语言字符需使用Unicode知识。

10. 信号处理与非局部跳转(<signal.h>, <setjmp.h>)

典型场景:捕捉Ctrl+C中断或在深层函数中发生错误时跳回上层函数。

示例(signal):

#include <stdio.h>
#include <signal.h>void handler(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handler);while (1) {// 按 Ctrl+C 看效果}return 0;
}

注意事项

  • 信号处理函数中只能调用异步信号安全函数。
  • 非局部跳转setjmp()longjmp()不推荐滥用,影响代码可读性和可维护性。

11. 可变参数(<stdarg.h>)

典型场景:实现自定义变参函数,比如日志函数。

示例

#include <stdio.h>
#include <stdarg.h>void print_numbers(int count, ...) {va_list args;va_start(args, count);for (int i = 0; i < count; i++) {int num = va_arg(args, int);printf("%d ", num);}va_end(args);printf("\n");
}int main() {print_numbers(3, 10, 20, 30);return 0;
}

注意事项

  • 需约定参数类型顺序,无类型安全检查。
  • 如果能固定参数数量或使用变参安全框架更好。

12. 原子与多线程(C11)(<stdatomic.h>, <threads.h>)

典型场景:使用标准原子操作、跨平台基础多线程。

示例(简单线程):

#include <stdio.h>
#include <threads.h>int func(void *arg) {printf("In thread: %d\n", *(int*)arg);return 0;
}int main() {int val = 42;thrd_t t;if (thrd_create(&t, func, &val) == thrd_success) {thrd_join(t, NULL);}return 0;
}

注意事项

  • 功能不如Java Thread和并发库丰富。仅适合简单多线程场景。
  • <stdatomic.h>提供类似C++原子操作功能,保证数据访问的原子性。

13. 对齐与不可返回函数(C11)

典型场景:特殊场景下需指定类型对齐或标识函数不返回。

示例

#include <stdalign.h>
#include <stdnoreturn.h>
#include <stdio.h>
#include <stdlib.h>_Noreturn void fail(const char *msg) {fprintf(stderr, "%s\n", msg);exit(EXIT_FAILURE);
}int main() {struct {alignas(16) int x; } s;s.x = 10;// fail("This function never returns");return 0;
}

注意事项

  • 大部分日常开发无需显式使用对齐特性。
  • _Noreturn函数不能返回,否则未定义行为。

14. 复数与特殊数学(C99)(<complex.h>, <fenv.h>, <tgmath.h>)

典型场景:科学计算,处理复数或控制浮点环境(如舍入方式)。

示例(复数):

#include <stdio.h>
#include <complex.h>
#include <math.h>int main() {double complex z = 1.0 + 2.0*I;double r = cabs(z);printf("|1+2i| = %f\n", r);return 0;
}

注意事项

  • 日常通用开发中很少使用。
  • <fenv.h>控制浮点异常、舍入等,需要特殊场景。

总结与建议

  • 安全性与内存管理:C无自动内存管理和越界检查,需格外小心。
  • 错误处理:充分利用errnoperror(), 并在调试期使用assert()确保逻辑正确。
  • 国际化与复杂场景:对于多语言文本、时区、本地化格式等,高级功能需<locale.h><wchar.h><wctype.h>支持,且平台相关性更高。
  • 扩展与第三方库:C标准库提供基础功能,如需高级数据结构、网络编程、图形界面等,需第三方库或操作系统API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36232.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C#设计模式(18)——中介者模式(Mediator Pattern)】

前言 中介者模式&#xff1a;是两者之间通过第三者来帮助传话。 代码 //抽象接收者public abstract class Receiver{protected Mediator mediator;protected Receiver(Mediator mediator){this.mediator mediator;}public abstract void SendMessage(string message);public a…

动态计算加载图片

学习啦 别名路径&#xff1a;①npm install path --save-dev②配置 // vite.config,js import { defineConfig } from vite import vue from vitejs/plugin-vueimport { viteStaticCopy } from vite-plugin-static-copy import path from path export default defineConfig({re…

Java HashMap用法详解

文章目录 一、定义二、核心方法三、实例演示3.1、方法示例3.2、get()方法注意点&#xff01; 一、定义 Java 的 HashMap 是 Java 集合框架中的一个非常重要的类&#xff0c;它实现了 Map 接口。HashMap基于哈希表的数据结构&#xff0c;允许使用键-值对存储数据。这种存储方式使…

淘宝直播间智能化升级:基于LLM的学习与分析

自营直播应用技术团队负责的业务中&#xff0c;淘宝买菜的直播业务起步较晚&#xff0c;业务发展压力较大&#xff0c;业务上也就有了期望能够对一些二方的标杆直播间进行学习&#xff0c;并将其优点应用到自己直播间的需求。 最初 - 人海战术&#xff0c;学习PK 业务侧最直接的…

有的开发者用Apache-2.0开源协议,但是不允许商用?合理吗

Apache 2.0开源协议是设计用来允许商业使用的。该协议明确授予了使用者在遵守许可条款的情况下&#xff0c;对软件进行复制、修改、分发以及商业使用的权利。这包括但不限于&#xff1a; 1. 永久、全球性的版权许可&#xff1a;允许复制、准备衍生作品、公开展示、公开演出、从…

java学习 -----项目(1)

项目 写在前面的话&#xff1a;耳机没电&#xff0c;先来写写今早的感受。说实话&#xff0c;我并不喜欢我们的职业规划老师&#xff0c;满嘴荒唐言&#xff0c;被社会那所大缸浸染了一身社会气。课快结束时&#xff0c;老师问还有谁的视频没做&#xff0c;我把手举了起来。&a…

某j vue3 ts 随笔

因为ts组件封装的缘故&#xff0c;使用某个组件就必须按照这个组件的规则使用&#xff0c;老是忘记&#xff0c;这里就记一下吧 1.ApiSelect 组件 {label: 角色,field: selectedroles,component: ApiSelect,componentProps: {mode: multiple,api: getAllRolesListNoByTenant,la…

红旗Asianux8.1+高斯GaussDB6.0安装手册

一、简介 服务器系统&#xff1a;红旗Asianux8.1&#xff08;需联网&#xff09;高斯GaussDB6.0&#xff1a;openGauss_6.0.0 极简版 二、安装准备 关闭防火墙 systemctl stop firewalld systemctl disable firewalld###查看状态 systemctl status firewalld 上传安装包 创建组…

如何实现Docker容器自动更新?从此无需再手动更新!(如何实现docker容器的自动更新、docker容器如何实现定时更新)

以下是经过优化后的完整文章内容: 文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Docker 容器自动更新的需求 📒📝 解决方案概述📝 Docker 容器自动更新📝 Docker 容器定期更新📝 实现指定容器更新或排除更新⚓️ 相关链接 ⚓️📖 介绍 📖 随着容器化技术的普…

python异常、模块和包

文章目录 异常异常简介异常处理捕获所有异常捕获指定异常捕获多个指定异常 异常else、finally异常的传递 模块模块导入自定义模块 包自定义python包安装第三方python包 综合案例 异常 异常简介 异常就是程序运行过程中出现了错误 f open(RLlearn_2.txt, "r", enc…

Python内存泄漏 —— 宏观篇

Python内存泄漏 —— 宏观篇 应该弄清楚哪些问题 内存情况如何&#xff0c;是否一直增长&#xff1f;哪些是异常对象&#xff1f;这类对象占总内存多大比例&#xff1f;异常对象为何泄漏&#xff1f;如何使其正常释放&#xff1f;如何确定异常对象正常释放了&#xff1f;如何…

Chromium CDP 开发(五):注册自己的指令(中)

引言 在前一篇文章中&#xff0c;我们已经了解了 PDL&#xff08;Protocol Description Language&#xff09;的基本功能以及如何在其中声明 CDP&#xff08;Chrome DevTools Protocol&#xff09;指令和事件的具体内容。接下来&#xff0c;我们将深入探讨如何在实际开发中进行…

回溯算法解决全排列问题

1. 问题描述 定义&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列 。 示例&#xff1a; 输入数组 [1, 2, 3] 输出结果应该为&#xff1a; leetcode 地址 2. 代码实现 package com.ztq.algorithm.BackTrack;import java.util.List; impo…

金融行业 IT 实践|某信托公司:从虚拟化到容器平台的 VMware 替代与双活建设实践

随着“VMware 替代” 在金融行业的快速推进&#xff0c;不少金融用户的替代进程已逐渐从存储、虚拟化过渡到容器平台层面&#xff0c;实现更为全面的 VMware 国产化替代与架构升级。其中&#xff0c;某信托用户在使用 SmartX 超融合&#xff08;采用 VMware 虚拟化和 Tanzu 容器…

python学习——格式化字符串

在Python中&#xff0c;格式化字符串是一种将变量插入到字符串中的方法&#xff0c;使得字符串的构建更为灵活和方便。以下是一些常见的格式化字符串的方法&#xff1a; 文章目录 1. 使用百分号 % 格式化2. 使用 str.format() 方法3. 使用 f-string (格式化字符串字面量)格式说…

【上线文档】系统上线方案模板,计算机系统上线保障计划,系统运维信息系统运行保障方案,系统上线方案模板(Word原件)

一、项目背景和目标 二、项目需求分析 2.1 功能需求 2.2 非功能需求 三、系统设计 3.1 系统架构设计 3.2 数据库设计 3.3 接口设计 3.4 用户界面设计 四、系统开发 4.1 开发环境搭建 4.2 业务逻辑开发 4.3 数据库实现 4.4 接口实现 4.5 用户界面实现 五、系统测…

MySQL索引再认识

在最近的一次MySQL测试过程中&#xff0c;我的同事幺加明遇到了一些令人困惑的现象&#xff0c;这些现象超出了我们最初的预期。一直以来&#xff0c;我们在建立索引时&#xff0c;首要考虑的原则是在区分度大的字段上建立索引。然而&#xff0c;在实际测试中&#xff0c;我们发…

SQL靶场第一关

打开sql靶场 一.判断注入类型 在网址输入?id1&#xff0c;页面正常回显 我们在输入?id1,页面报错&#xff0c;说明存在sql注入 我们再输入?id1 and 11--&#xff0c;页面正常回显 我们在输入?id1 and 12--&#xff0c;页面没有回显 这里我们知道了是字符型注入 为什么是…

ollama运行qwen2.5-coder:7b

1.linux安装 curl -fsSL https://ollama.com/install.sh | sh ollama serve # 启动ollama ollama create # 从模型文件创建模型 ollama show # 显示模型信息 ollama run # 运行模型&#xff0c;会先自动下载模型 ollama pull # 从注册仓库中拉取模…

牛客——打印日期,日期累加(C++)

目录 1.日期累加 1.1题目描述 1.2思路 1.3 2.打印日期 2.1题目描述 2.2思路 2.3代码 1.日期累加 1.1题目描述 计算一个日期加上若干天后是什么日期。输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。输出m行&#xff0c;每行按…