C语言常用标准头文件
头文件的基础概念
在C的系列语言程序中,头文件(通常扩展名为.h)被大量使用,它通常包含函数、变量、结构体等的声明和定义,以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码,它可以被多个源文件共享,从而实现代码的重用和模块化。
头文件原理
- 代码组织与模块化:在一个应用开发体系中,功能的真正逻辑实现通常是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。头文件作为用户应用程序和函数库之间的桥梁和纽带,有助于将程序的不同部分组织成模块,每个模块负责完成特定的功能。
- 声明与定义分离:头文件主要保存程序的声明,如函数原型、变量声明、结构体定义等,而定义文件(通常扩展名为.c)则保存程序的实现。这种分离使得代码结构更清晰,同时也方便代码的复用和修改。
- 防止定义冲突:头文件通过预处理指令(如ifndef/define/endif)来防止重复包含同一个头文件,从而避免定义冲突。
- 代码复用:由于头文件可以被多个源文件包含,因此它提供了一种方便的代码复用机制。程序员可以将一些常用的函数声明、变量声明和宏定义放在头文件中,然后在需要的地方包含这个头文件,从而避免重复编写相同的代码。
- 类型定义与内联函数:头文件可能包含自定义的数据类型定义和内联函数的定义。这些类型可以在整个程序中使用,而内联函数则可以在编译时进行展开,从而提高程序的执行效率。
- 编译时链接:在编译时,编译器会查找头文件中声明的函数和变量,并将其与实际定义进行链接。这种链接过程确保了在硬件层面实现功能时能够找到正确的代码实现。
常用头文件作用表
头文件 | 作用 | 关键函数/宏/类型 |
---|---|---|
<stdio.h> | 标准输入输出库 | printf() , scanf() , fgets() , fputs() , fopen() , fclose() , snprintf() , vprintf() 等 |
<stdlib.h> | 常用函数库 | malloc() , free() , exit() , rand() , srand() , abs() , div() , lldiv() 等 |
<string.h> | 字符串处理库 | strlen() , strcpy() , strcat() , strcmp() , strstr() , memcpy() , memset() 等 |
<math.h> | 数学函数库 | sin() , cos() , tan() , sqrt() , pow() , log() , exp() , ceil() , floor() 等 |
<ctype.h> | 字符处理库 | isalpha() , isdigit() , isupper() , tolower() , toupper() 等 |
<time.h> | 时间处理库 | time() , localtime() , strftime() , gmtime() , difftime() , mktime() , clock() 等 |
<assert.h> | 断言库 | assert() |
<errno.h> | 错误号定义库 | errno (全局变量) |
<limits.h> | 数据类型属性库 | INT_MAX , INT_MIN , CHAR_MAX , CHAR_MIN , SIZE_MAX 等 |
<float.h> | 浮点数属性库 | FLT_MAX , DBL_MAX , LDBL_MAX , FLT_EPSILON , DBL_EPSILON 等 |
<stdbool.h> | 布尔类型库 | bool , true , false |
<stddef.h> | 标准定义库 | size_t , NULL , offsetof() , ptrdiff_t 等 |
<setjmp.h> | 非局部跳转库 | setjmp() , longjmp() |
<signal.h> | 信号处理库 | signal() , raise() |
<stdint.h> | 固定宽度整数类型库 | int8_t , int16_t , int32_t , int64_t , uint8_t , uint16_t , uint32_t , uint64_t 等 |
<inttypes.h> | 整数类型格式化库 | PRId8 , PRIu8 , PRIX8 , PRId16 , PRIu16 , PRIX16 , … 等宏用于printf 和scanf 系列函数 |
常用标准头文件使用实例
stdio.h
制作一个简易的的四则运算小计算器,使用stdio.h
头文件中的printf()
函数和scanf()
函数
#include <stdio.h> int main() { double num1, num2; char operator; double result; printf("请输入第一个数字: "); scanf("%lf", &num1); // 使用%lf读取double类型 printf("请输入运算符 (+, -, *, /): "); scanf(" %c", &operator); // 前面的空格用于跳过任何之前的空白字符 printf("请输入第二个数字: "); scanf("%lf", &num2); switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if (num2 != 0.0) { result = num1 / num2; } else { printf("错误:除数不能为0\n"); return 1; // 非零返回值表示程序异常退出 } break; default: printf("错误:无效的运算符\n"); return 1; } printf("%.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result); return 0;
}
stdlib.h
使用stdlib.h
头文件,根据用户输入的整数来分配动态内存分配。
#include <stdio.h>
#include <stdlib.h> int main() { int n, *ptr, i; printf("请输入一个整数n: "); scanf("%d", &n); // 动态分配内存以存储n个整数 ptr = (int*)malloc(n * sizeof(int)); if (ptr == NULL) { printf("内存分配失败!\n"); exit(EXIT_FAILURE); // 退出程序 } // 初始化数组 for (i = 0; i < n; ++i) { ptr[i] = i + 1; } printf("数组元素为: "); for (i = 0; i < n; ++i) { printf("%d ", ptr[i]); } printf("\n"); // 释放分配的内存 free(ptr); return 0;
}
string.h
使用string.h
头文件拼接两个字符
#include <stdio.h>
#include <string.h> int main() { char str1[50], str2[50]; printf("请输入第一个字符串: "); fgets(str1, sizeof(str1), stdin); // 读取字符串,包括换行符 str1[strcspn(str1, "\n")] = 0; // 移除字符串末尾的换行符 printf("请输入第二个字符串: "); fgets(str2, sizeof(str2), stdin); str2[strcspn(str2, "\n")] = 0; // 连接两个字符串 strcat(str1, str2); printf("连接后的字符串为: %s\n", str1); return 0;
}
math头文件
使用math.h
头文件计算圆的面积和周长
#include <stdio.h>
#include <math.h> #define M_PI 3.14159265358979323846 int main() { double radius, area, circumference; printf("请输入圆的半径: "); scanf("%lf", &radius); // 计算圆的面积 area = M_PI * radius * radius; // 使用预定义的M_PI常量 // 计算圆的周长 circumference = 2 * M_PI * radius; printf("圆的面积为: %.2lf\n", area); printf("圆的周长为: %.2lf\n", circumference); return 0;
}
ctype
使用ctype.h
进行字符处理,转换输入字符的大小写
#include <stdio.h>
#include <ctype.h> int main() { char ch; printf("请输入一个字符: "); scanf(" %c", &ch); // 判断字符类型 if (isalpha(ch)) { printf("这是一个字母字符\n"); } else if (isdigit(ch)) { printf("这是一个数字字符\n"); } else if (isspace(ch)) { printf("这是一个空白字符\n"); } else { printf("这是一个特殊字符\n"); } // 转换字符大小写if (isalpha(ch)) { ch = isupper(ch) ? tolower(ch) : toupper(ch); printf("转换后的字符为: %c\n", ch); } return 0;
}
time.h
获取当前时间
#include <stdio.h>
#include <time.h>int main() {// 获取当前时间time_t current_time;current_time = time(NULL);// 将time_t转换为本地可读的字符串格式char* c_time_string = ctime(¤t_time);printf("当前时间是: %s", c_time_string);return 0;
}
assert.h
程序调试断言
#include <stdio.h>
#include <assert.h>int main() {int x = 5;int y = 0;// 使用assert进行调试断言assert(y != 0); // y为0所以会触发断言失败,// 如果断言成功,程序继续执行,如果断言失败,程序会打印一条错误消息并终止执行int z = x / y;printf("z的值为: %d\n", z); // 这行不会被执行return 0;
}
errno.h
错误处理
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>int main() {FILE *fp = fopen("test.txt", "r");if (fp == NULL) {// 使用errno获取并打印最后发生的系统调用的错误号printf("打开文件失败: %s\n", strerror(errno));exit(EXIT_FAILURE);}fclose(fp);return 0;
}
limits.h
查看数据类型限制
#include <stdio.h>
#include <limits.h>int main() {// 打印整型变量的范围printf("int的最大值为: %d\n", INT_MAX);printf("int的最小值为: %d\n", INT_MIN);// 打印无符号整型变量的范围printf("unsigned int的最大值为: %u\n", UINT_MAX);return 0;
}
float.h
查看浮点型限制
#include <stdio.h>
#include <float.h>int main() {// 打印float类型的最大和最小值printf("float的最大正有限值为: %e\n", FLT_MAX);printf("float的最小正有限值为: %e\n", FLT_MIN);// 打印double类型的最大和最小值printf("double的最大正有限值为: %e\n", DBL_MAX);printf("double的最小正有限值为: %e\n", DBL_MIN);// 打印float类型的精度printf("float的精度(epsilon): %e\n", FLT_EPSILON);return 0;
}
stdbool.h
布尔类型
#include <stdio.h>
#include <stdbool.h>int main() {bool flag = true;if (flag) {printf("标志是 true\n");} else {printf("标志是 false\n");}flag = false;if (!flag) {printf("现在标志是 false\n");}return 0;
}
stddef.h
标准定义
#include <stdio.h>
#include <stddef.h>int main() {// 使用size_t类型,它是用于数组索引和循环计数的无符号整数类型size_t arraySize = 10;int array[arraySize];// 使用ptrdiff_t类型,它是两个指针相减的结果的类型int *ptr1 = array;int *ptr2 = &array[5];ptrdiff_t diff = ptr2 - ptr1;printf("ptr2和ptr1之间的差是: %td\n", diff);// 使用NULL宏作为指针的空值int *nullPtr = NULL;if (nullPtr == NULL) {printf("nullPtr 是 NULL\n");}return 0;
}
setjmp.h
非局部跳转
#include <stdio.h>
#include <setjmp.h>jmp_buf env;void function() {longjmp(env, 1); // 非局部跳转回setjmp的位置
}int main() {if (setjmp(env) != 0) { // 如果longjmp被调用,setjmp返回非零值printf("Longjmp was called!\n");} else {printf("About to call function...\n");function(); // 这个调用会导致longjmp被触发}return 0;
}
signal.h
信号处理,通过按下Ctrl+C来发送SIGINT信号触发signalHandler
函数
#include <stdio.h>
#include <signal.h>
#include <unistd.h>void signalHandler(int signum) {printf("接收到信号 %d\n", signum);exit(signum);
}int main() {// 注册信号SIGINT和处理函数signal(SIGINT, signalHandler);while(1) {printf("运行中...\n");sleep(1);}return 0;
}
stdint.h
固定宽度整数类型
#include <stdio.h>
#include <stdint.h>int main() {int8_t int8 = 127; // 8位有符号整数uint8_t uint8 = 255; // 8位无符号整数int16_t int16 = 32767; // 16位有符号整数uint32_t uint32 = 4294967295U; // 32位无符号整数int64_t int64 = 9223372036854775807LL; // 64位有符号整数printf("int8: %d\n", int8);printf("uint8: %u\n", uint8);printf("int16: %d\n", int16);printf("uint32: %u\n", uint32);printf("int64: %lld\n", int64);return 0;
}
inttypes.h
整数类型格式化
#include <stdio.h>
#include <inttypes.h>int main() {uint32_t number = 123456789U;// 使用inttypes.h中定义的宏来格式化输出printf("使用PRIu32: %" PRIu32 "\n", number);return 0;
}
相关文章:

C语言常用标准头文件
头文件的基础概念 在C的系列语言程序中,头文件(通常扩展名为.h)被大量使用,它通常包含函数、变量、结构体等的声明和定义,以及一些宏定义和类型定义。头文件的主要作用是为了方便管理和重用代码,它可以被多…...

vuejs3用gsap实现动画
效果 gsap官网地址: https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…...

企业级-PDF文件下载
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/rpc-netty-framework 留给读者 一、介绍 文件下载在浏览器可以根据响应头设置纯下载和直接打开两种方式。 二、代码 RequestMapping("/…...

00 - React 基础
1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名 如:npx create-react-app react-redux-proJSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 Java…...

基于WPF技术的换热站智能监控系统17--项目总结
1、项目颜值,你打几分? 基于WPF技术的换热站智能监控系统01--项目创建-CSDN博客 基于WPF技术的换热站智能监控系统02--标题栏实现-CSDN博客 基于WPF技术的换热站智能监控系统03--实现左侧加载动画_wpf控制系统-CSDN博客 基于WPF技术的换热站智能监…...

CI /CD学习
CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…...

基于matlab的高斯滤波与图像去噪
1 高斯滤波原理 1.1 原理 高斯滤波是一种线性平滑滤波技术,主要用于消除图像中的高斯噪声。它的工作原理可以理解为对整幅图像进行加权平均的过程,即每个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。 高斯滤波实质上是一种信号的滤…...

解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。
demo <template><view class"content"><image class"logo" src"/static/logo.png"></image><button click"previewImage">预览图片</button></view> </template><script> //打…...

Jenkins nginx自动化构建前端vue项目
在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方…...

Devicetree - 删除某个节点或属性
在设备树(devicetree)中,删除语法用于从现有设备树中删除属性或节点。这通常在设备树覆盖文件(DTS)或片段文件中完成。该语法使用 /delete-property/ 和 /delete-node/ 指令。 以下是如何使用这些指令的示例࿱…...

Xcode will continue when the operation completes
Xcode 15后,连接手机经常出现 Preparing iPhone. Xcode will continue when the operation completes.记录一下解决办法。其他提示,Xcode连接不上手机也可以尝试通过这个方法解决。 注意:最好关闭科学上网再操作。 从Xcode取消iPhone的配对(右键单击 -Unpair Devi…...

Python爬虫-贝壳新房
前言 本文是该专栏的第32篇,后面会持续分享python爬虫干货知识,记得关注。 本文以某房网为例,如下图所示,采集对应城市的新房房源数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地…...

Canvas绘制图片和区域
如何使用Canvas在图片上绘制区域? 一. 首先,我们需要初始化三个canvas画布(初始化Canvas) initCanvas() {// 初始化canvas画布let canvasWrap document.getElementsByClassName("canvas-wrap");this.wrapWidth canva…...

Day10—Spark SQL基础
Spark SQL介绍 Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据,是指具有Schema信息的数据,例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同,Spark SQL提供了对结构化数据的查询和计算接口。 Spark …...

开源技术:在线教育系统源码及教育培训APP开发指南
本篇文章,小编将探讨如何利用开源技术开发在线教育系统及教育培训APP,旨在为有志于此的开发者提供全面的指导和实践建议。 一、在线教育系统的基本构架 1.1架构设计 包括前端、后端和数据库三个主要部分。 1.2前端技术 在前端开发中,HTML…...

[C++][设计模式][观察者模式]详细讲解
目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一1.FileSplitter.cpp2.MainForm.cpp 2.代码二1.FileSplitter.cpp2.MainForm.cpp 1.动机 在软件构建过程中,需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变,所有的依赖对象…...

Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件
Adobe Acrobat,它凭借卓越的功能和丰富的工具,为用户提供了一个全面的解决方案,用于查看、创建、编辑和管理各种PDF文件。 作为一款专业的PDF阅读器,Adobe Acrobat能够轻松打开并展示各种格式的PDF文档,无论是文字、图…...

eVTOL飞机:技术挑战、应用机遇和运动的作用
最近,航空业的嗡嗡声围绕着电动空中出租车、空中拼车、无人驾驶航空货物运送等。这些概念都依赖于一类称为eVTOL的飞机,eVTOL是电动垂直起降的缩写。 与直升机类似,但没有噪音和排放,eVTOL可以在不需要简易机场的情况下飞行、悬停…...

【python】flask中如何向https服务器传输信息
【背景】 用flask做一个支持流媒体传输的网页,如何将信息post给流媒体服务器呢? 【方法】 简单例子,视图函数这么写: url = "https://yourip/mytext" headers = {Content-Type:application/octet-stream} @app.route(/,methods=["POST"...

计算机网络 —— 应用层(FTP)
计算机网络 —— 应用层(FTP) FTP核心特性:运作流程: FTP工作原理主动模式被动模式 我门今天来看应用层的FTP(文件传输协议) FTP FTP(File Transfer Protocol,文件传输协议&#x…...

zookeeper + kafka消息队列
zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列(Message Queue)是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 (1)特性 异步…...

Python高级编程:深度学习基础
Python高级编程:深度学习基础 在前几篇文章中,我们探讨了Python的基础语法、面向对象编程、标准库、第三方库、并发编程、异步编程、网络编程与网络爬虫、数据库操作与ORM、数据分析与数据可视化以及机器学习基础。在这篇文章中,我们将深入探讨Python在深度学习领域的应用。…...

如何从magento1迁移到magento2
m2相较m1 变化可以说非常大,相当于从头到位都改写一遍,更现代化,更优雅。除了数据库表变化不是很大。 主要迁移的内容有: 1,主题 2,插件(自己开发的或者第三方插件) 3,数据库 主题 不能迁移到m…...

【Nginx】Nginx安装及简单使用
https://www.bilibili.com/video/BV1F5411J7vK https://www.kuangstudy.com/bbs/1353634800149213186 https://stonecoding.net/system/nginx/nginx.html https://blog.csdn.net/qq_40492693/article/details/124453090 Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器。其特…...

【Linux系列】find命令使用与用法详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Apple - DNS Service Discovery Programming Guide
本文翻译整理自:DNS Service Discovery Programming Guide(更新日期:2013-08-08 https://developer.apple.com/library/archive/documentation/Networking/Conceptual/dns_discovery_api/Introduction.html#//apple_ref/doc/uid/TP30000964 文…...

如何高效地为pip换源:详细操作指南
在Python开发中,pip是我们不可或缺的包管理工具。然而,默认的官方源下载速度较慢,尤其是在国内使用时可能会遇到网络问题。为了提高下载速度,我们可以通过更换国内的镜像源来解决这一问题。本文将详细介绍如何高效地为pip换源&…...

免费ddns工具,快解析DNS解析使用教程
DDNS(Dynamic Domain Name Server),中文叫动态域名解析,主要用于没有固定公网ip的网络环境下,使用一个固定的域名,解析动态变化的ip地址,达到远程访问的目的。 众所周知,目前公网ip资源非常紧缺…...

【Vite】控制打包结构
配置 vite.config.json 文件: import { defineConfig } from "vite";export default defineConfig({// ...build: {rollupOptions: {output: {entryFileNames: "js/[name]-[hash].js",chunkFileNames: "js/[name]-[hash].js",assetF…...

Debian Linux安装minikubekubectl
minikube&kubectl minkube用于在本地开发环境中快速搭建一个单节点的Kubernetes集群,还有k3s,k3d,kind都是轻量级的k8skubectl是使用K8s API 与K8s集群的控制面进行通信的命令行工具 这里使用Debian Linux演示,其他系统安装见官网,首先…...