当前位置: 首页 > news >正文

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, … 等宏用于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.lryc.cn/news/380902.html

相关文章:

  • vuejs3用gsap实现动画
  • 企业级-PDF文件下载
  • 00 - React 基础
  • 基于WPF技术的换热站智能监控系统17--项目总结
  • CI /CD学习
  • 基于matlab的高斯滤波与图像去噪
  • 解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。
  • Jenkins nginx自动化构建前端vue项目
  • Devicetree - 删除某个节点或属性
  • Xcode will continue when the operation completes
  • Python爬虫-贝壳新房
  • Canvas绘制图片和区域
  • Day10—Spark SQL基础
  • 开源技术:在线教育系统源码及教育培训APP开发指南
  • [C++][设计模式][观察者模式]详细讲解
  • Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件
  • eVTOL飞机:技术挑战、应用机遇和运动的作用
  • 【python】flask中如何向https服务器传输信息
  • 计算机网络 —— 应用层(FTP)
  • zookeeper + kafka消息队列
  • Python高级编程:深度学习基础
  • 如何从magento1迁移到magento2
  • 【Nginx】Nginx安装及简单使用
  • 【Linux系列】find命令使用与用法详解
  • Apple - DNS Service Discovery Programming Guide
  • 如何高效地为pip换源:详细操作指南
  • 免费ddns工具,快解析DNS解析使用教程
  • 【Vite】控制打包结构
  • Debian Linux安装minikubekubectl
  • Discuz动漫二次元风格网站模板