C语言常用标准头文件

news2024/12/25 12:57:16

头文件的基础概念

在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, … 等宏用于printfscanf系列函数

常用标准头文件使用实例

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(&current_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;
}

在这里插入图片描述

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

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

相关文章

图纸管理系统的选择:为企业带来的长远价值

图纸管理系统的选择&#xff1a;为企业带来的长远价值 在当今高度信息化和数字化的时代&#xff0c;图纸管理系统的选择对于企业的长远发展至关重要。一个好的图纸管理系统不仅能提升企业的运营效率&#xff0c;还能为企业在激烈的市场竞争中赢得先机。以下我们将详细探讨图纸…

【算法面试】二分查找:如何在有序数组中高效搜索目标值

目录 题目描述 示例 1: 示例 2: 问题分析 解决方法 方法 1&#xff1a;标准二分查找 方法 2&#xff1a;递归二分查找 方法 3&#xff1a;非递归简化版本 方法 4&#xff1a;带调试信息的版本 详细步骤 总结 博主v&#xff1a;XiaoMing_Java 二分查找是一种常见的算…

RabbitMQ实践——使用WebFlux响应式方式实时返回队列中消息

大纲 Pom.xml监听队列实时返回消息测试完整代码工程代码 在之前的案例中&#xff0c;我们在管理后台收发消息都是通过短连接的形式。本文我们将探索对队列中消息的实时读取&#xff0c;并通过流式数据返回给客户端。 webflux是反应式Web框架&#xff0c;客户端可以通过一个长连…

外部网络如何访问内网?

在现代信息化时代&#xff0c;随着企业规模的扩大和业务范围的扩展&#xff0c;越来越多的企业需要实现外部网络访问内网的需求。外部网络访问内网指的是在外部网络环境下&#xff0c;通过互联网等公共网络途径&#xff0c;实现对企业内部网络的访问和操作。这种需求的出现&…

骑马与砍杀战团mod制作-基础-军队笔记(一)

骑马与砍杀战团mod制作-基础-军队装备笔记&#xff08;一&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sourcea507…

代码随想录——摆动序列(Leetcode376)

题目链接 贪心 class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length < 1){return nums.length;}// 当前一对差值int cur 0;// 前一对差值int pre 0;// 峰值个数int res 1;for(int i 0; i < nums.length - 1; i){cur nums[i 1] - nums[i];i…

STM32单片机系统

1.STM32最小系统 微型计算机&#xff08;面&#xff09; 单片机最小系统是指能够将单片机芯片运行所必需的最少的硬件电路集成在一起的系统。 它是一种基本的单片机应用系统&#xff0c;通常由主芯片&#xff0c;时钟电路&#xff0c;复位电路&#xff0c;电源电路&#xff0c…

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…

大数据集群数据传输

简单的服务器间的通信示例 netcat&#xff0c;简写为 nc&#xff0c;是 unix 系统下一个强大的命令行网络通信工具&#xff0c;用于在两台主机之间建立 TCP 或者 UDP 连接&#xff0c;并提供丰富的命令进行数据通信。nc 在网络参考模型属于应用层。使用 nc 可以做很多事情&…

《Windows API每日一练》5.5 插入符号

当你向程序中输入文本时&#xff0c;通常会有下划线、竖线或方框指示你输入的下一个字符将出现在屏幕上的位置。你也许认为这是“光标”&#xff0c;但在编写Windows程序时&#xff0c;你必须避免这种习惯。在Windows中&#xff0c;它被称为“插入符号”&#xff08;caret&…

NUS、清华提出STAR:一句话生成高质量4D Avatar,代码已开源

©PaperWeekly 原创 作者 | Chai Zenghao 单位 | 新加坡国立大学博士生 研究方向 | 3D生成 背景 在计算机图形学和数字虚拟人领域&#xff0c;从简单的文本提示生成更真实、可交互的虚拟人物是是目前广受关注的研究课题。然而&#xff0c;先前的 3D Avatar 生成方法存在一…

陀螺仪LSM6DSV16X与AI集成(7)----FIFO数据读取与配置

陀螺仪LSM6DSV16X与AI集成.7--检测自由落体 概述视频教学样品申请源码下载主要内容生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置量程设置FIFO水印设置速率使用流模式设置FIFO时间戳批处理速率使能时间戳FIFO状态寄存器演示…

【ajax核心05】宏任务与微任务

ES6之后引入Promise对象(用来管理异步任务)&#xff0c;让JS引擎也可以发起异步任务 一&#xff1a;异步任务分类 异步任务分为&#xff1a;宏任务与微任务 宏任务 由浏览器环境执行的异步代码 具体宏任务分类 微任务 由JS引擎执行的代码 创建Promise对象时&#xff0c;…

【鸿蒙】ERROR_GET_BUNDLE_INSTALLER_FAILED

错误信息 [ERROR_GET_BUNDLE_INSTALLER_FAILED] Troubleshooting guide $ hdc file send D:\Huawei\devEcoProjects\entry\build\default\outputs\default\entry-default-unsigned.hap /sdcard/e8a215ea7be1444197e6a58ebda7721f/entry-default-unsigned.hap Error while Depl…

Vue74-路由传参2

一、$route中的params参数 二、在配置路由的index.js文件中&#xff0c;声明传参 占位符用的什么名字&#xff0c;params里面的key就是什么。 三、<router-link>标签中传参 3-1、to字符串写法 3-2、to的对象写法 注意&#xff1a;若是用params携带参数&#xff0c;不…

联盟学习:技术原理、特点及适用场景

一、引言 随着大数据和人工智能技术的快速发展&#xff0c;数据成为了推动科技进步的重要资源。然而&#xff0c;在实际应用中&#xff0c;数据往往呈现出碎片化、分散化的特点&#xff0c;如何有效地利用这些数据成为了业界关注的焦点。联盟学习&#xff08;Federated Learni…

异地组网如何OEM?

在现代信息社会中&#xff0c;企业越来越需要跨地域进行数据传输与共享。面临的挑战却是如何在不暴露在公网的情况下&#xff0c;实现异地组网并保障数据的安全性。本文将介绍一种名为“异地组网OEM”的解决方案&#xff0c;该方案能够通过私有通道传输数据并对数据进行安全加密…

Docker Compose--安装Nginx--方法/实例

原文网址&#xff1a;Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config │ ├── cert │ │ ├── xxx_bundle.pem │ │ └── xxx.key │ ├── conf.d │ …

解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf

想弹出移动硬盘时&#xff0c;Windows告诉我设备正在使用 然后我使用LockHunter查看到底是哪个应用在使用我的移动硬盘&#xff0c;发现是 System(PID 4) E x t e n d Extend ExtendRmMetadata T x f L o g TxfLog TxfLogTxfLog.blf这个文件正在使用 这是一个索引文件 解决 …

黑马HarmonyOS-NEXT星河版实战

"黑马HarmonyOS-NEXT星河版实战"课程旨在帮助学员深入了解HarmonyOS-NEXT星河版操作系统的开发和实际应用。学员将学习操作系统原理、应用开发技巧和界面设计&#xff0c;通过实战项目提升技能。课程注重实践与理论相结合&#xff0c;为学员提供全面的HarmonyOS开发经…