C 标准函数库概述

什么是 C 标准函数库?

C 标准函数库(C standard library)是 C 语言编程中的基础组成部分,由符合标准的头文件及常用函数库实现构成。简单来说,它就像是 C 语言的“工具箱”,当我们需要使用某个功能时,只需包含对应的“说明书”(头文件),就可以直接调用现成的工具(函数)。

标准库的组织结构

C 标准库主要通过 头文件(Header Files) 来组织。每个头文件都声明了一组特定功能的函数、类型和宏。

使用标准库函数的通用步骤是:

 #include <头文件.h>  // 包含头文件
 ​
 int main() {
     // 调用库函数
     函数名(参数);
     return 0;
 }

最常用的 C 标准库

以下几个头文件是最常用、需要掌握:

头文件中文名功能描述
stdio.h标准输入输出库提供输入输出函数(printf、scanf、文件操作等)
stdlib.h标准库函数提供通用工具(内存分配、随机数、程序控制等)
string.h字符串处理库提供字符串操作函数(复制、连接、比较等)
math.h数学函数库提供数学计算函数(三角函数、幂函数、绝对值等)
ctype.h字符处理库提供字符分类和转换函数
time.h时间日期库提供时间和日期处理函数

输入输出:stdio.h

stdio.h 是 C 语言中最常用的头文件,它定义了核心的输入输出函数。

标准输入输出函数

printf() - 格式化输出

printf 函数用于将格式化的数据输出到标准输出设备。

函数原型

int printf(const char *format, ...);

格式说明符

  • %d:输出整数

  • %f:输出浮点数

  • %c:输出单个字符

  • %s:输出字符串

  • %p:输出指针地址

  • %x:输出十六进制数

示例

#include <stdio.h>
 ​
 int main() {
     int num = 42;
     float pi = 3.14159;
     char ch = 'A';
     char str[] = "Hello, world!";
     
     printf("整数:%d\n", num);
     printf("浮点数(保留两位小数):%.2f\n", pi);
     printf("字符:%c\n", ch);
     printf("字符串:%s\n", str);
     printf("混合输出:%d + %.2f = %.2f\n", num, pi, num + pi);
     
     return 0;
 }
scanf() - 格式化输入

scanf 函数用于从标准输入设备读取格式化的数据。

函数原型

int scanf(const char *format, ...);

重要提示:变量前必须加 & 取地址符(数组名除外)。

示例

#include <stdio.h>
 ​
 int main() {
     int age;
     float height;
     char name[50];
     
     printf("请输入你的年龄:");
     scanf("%d", &age);
     
     printf("请输入你的身高(米):");
     scanf("%f", &height);
     
     printf("请输入你的姓名:");
     scanf("%s", name);  // 数组名本身就是地址,不需要&
     
     printf("\n--- 你的信息 ---\n");
     printf("姓名:%s\n", name);
     printf("年龄:%d岁\n", age);
     printf("身高:%.2f米\n", height);
     
     return 0;
 }
字符输入输出

getchar()putchar():用于单个字符的读写。

函数原型

 int getchar(void);
 int putchar(int c);

示例

 #include <stdio.h>
 ​
 int main() {
     char ch;
     
     printf("请输入一个字符:");
     ch = getchar();  // 读取一个字符
     
     printf("您输入的字符是:");
     putchar(ch);     // 输出一个字符
     putchar('\n');   // 输出换行符
     
     return 0;
 }

gets()puts():用于字符串的读写(注意:gets 不安全,建议用 fgets 替代)。

函数原型

 char *gets(char *str);          // 已废弃,切勿使用
 int puts(const char *str);

示例

#include <stdio.h>

int main() {
    char str[100];
    
    printf("请输入一行文字:");
    fgets(str, sizeof(str), stdin);  // 安全的替代方案
    
    printf("您输入的是:");
    puts(str);  // 自动添加换行符
    
    return 0;
}

文件操作函数

C 语言通过文件指针(FILE*)进行文件操作。

函数功能常用模式
fopen()打开文件"r"(读)、"w"(写)、"a"(追加)
fclose()关闭文件成功返回 0,失败返回 EOF
fprintf()向文件写入格式化数据类似 printf
fscanf()从文件读取格式化数据类似 scanf
fgetc()/fputc()读写单个字符-
fgets()/fputs()读写字符串-
fread()/fwrite()读写二进制数据-

文件操作示例

 #include <stdio.h>
 ​
 int main() {
     FILE *fp;
     char buffer[100];
     
     // 写入文件
     fp = fopen("test.txt", "w");  
     //fopen该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
     if (fp == NULL) {
         printf("无法打开文件\n");
         return 1;
     }
     fprintf(fp, "Hello, File!\n");
     fprintf(fp, "这是第二行\n");
     fclose(fp);
     
     // 读取文件
     fp = fopen("test.txt", "r");
     if (fp == NULL) {
         printf("无法打开文件\n");
         return 1;
     }
     while (fgets(buffer, sizeof(buffer), fp) != NULL) {
         printf("%s", buffer);
     }
     fclose(fp);
     
     return 0;
 }

通用工具:stdlib.h

stdlib.h 定义了数值转换、内存分配、随机数生成等通用工具函数。

字符串转换函数

函数功能示例
atoi()字符串转整数int num = atoi("123");
atof()字符串转浮点数double d = atof("3.14");
atol()字符串转长整数long l = atol("123456");

示例

 #include <stdio.h>
 #include <stdlib.h>
 ​
 int main() {
     char str1[] = "123";
     char str2[] = "3.14159";
     char str3[] = "42abc";  // 会转换前面的数字部分
     
     int num = atoi(str1);
     double pi = atof(str2);
     int num2 = atoi(str3);
     
     printf("整数:%d\n", num);
     printf("浮点数:%f\n", pi);
     printf("部分转换:%d\n", num2);
     
     return 0;
 }

动态内存分配函数

动态内存管理是 C 语言的重要特性。

函数功能
malloc()分配指定字节数的内存,内容未初始化
calloc()分配指定数量和大小的内存,并初始化为 0
realloc()重新调整之前分配的内存大小
free()释放之前分配的内存

示例

 #include <stdio.h>
 #include <stdlib.h>
 ​
 int main() {
     int *arr;
     int n = 5;
     
     // 动态分配内存
     arr = (int*)malloc(n * sizeof(int));
     if (arr == NULL) {
         printf("内存分配失败\n");
         return 1;
     }
     
     // 使用内存
     for (int i = 0; i < n; i++) {
         arr[i] = i * 10;
         printf("%d ", arr[i]);
     }
     printf("\n");
     
     // 释放内存
     free(arr);
     
     return 0;
 }

随机数生成函数

函数功能
rand()返回 0 到 RAND_MAX 之间的 随机数
srand()设置随机数种子

示例

 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 ​
 int main() {
     // 使用当前时间作为随机数种子
     srand(time(NULL));
     
     // 生成10个1-100之间的随机数
     for (int i = 0; i < 10; i++) {
         int num = rand() % 100 + 1;
         printf("%d ", num);
     }
     printf("\n");
     
     return 0;
 }

程序控制函数

函数功能
exit()终止程序执行
system()执行系统命令

示例

 #include <stdio.h>
 #include <stdlib.h>
 ​
 int main() {
     printf("准备执行系统命令...\n");
     system("ls -la");  // Linux/Mac下列出文件,Windows下可用"dir"
     
     printf("程序即将结束...\n");
     exit(0);  // 正常退出
     printf("这行不会被执行\n");
 }

字符串处理:string.h

string.h 提供了大量字符串操作函数。

常用字符串函数

函数功能注意事项
strcpy()复制字符串目标数组必须足够大
strncpy()指定长度复制更安全
strcat()连接字符串目标数组必须足够大
strncat()指定长度连接更安全
strcmp()比较字符串相等返回 0
strncmp()指定长度比较-
strlen()获取字符串长度不包括'\0'
strchr()查找字符首次出现返回指针
strstr()查找子串首次出现返回指针

详细示例

 #include <stdio.h>
 #include <string.h>
 ​
 int main() {
     char str1[50] = "Hello";
     char str2[] = " World";
     char str3[50];
     char str4[] = "Hello World";
     
     // 字符串复制
     strcpy(str3, str1);
     printf("str3: %s\n", str3);
     
     // 字符串连接
     strcat(str1, str2);
     printf("str1: %s\n", str1);
     
     // 字符串长度
     printf("str1长度:%zu\n", strlen(str1));
     
     // 字符串比较
     if (strcmp(str1, str4) == 0) {
         printf("str1 等于 str4\n");
     } else {
         printf("str1 不等于 str4\n");
     }
     
     // 查找字符
     char *p = strchr(str1, 'W');
     if (p != NULL) {
         printf("找到字符'W',位置:%ld\n", p - str1);
     }
     
     // 查找子串
     p = strstr(str1, "World");
     if (p != NULL) {
         printf("找到子串\"World\",位置:%ld\n", p - str1);
     }
     
     return 0;
 }

内存操作函数

函数功能
memset()将内存区域设置为指定值
memcpy()复制内存区域
memmove()复制内存区域(处理重叠)
memcmp()比较内存区域

示例

 #include <stdio.h>
 #include <string.h>
 ​
 int main() {
     int arr[5];
     
     // 将数组所有字节设置为0
     memset(arr, 0, sizeof(arr));
     
     // 复制数组
     int src[5] = {1, 2, 3, 4, 5};
     int dest[5];
     memcpy(dest, src, sizeof(src));
     
     // 输出结果
     for (int i = 0; i < 5; i++) {
         printf("%d ", dest[i]);
     }
     printf("\n");
     
     return 0;
 }

数学函数:math.h

math.h 定义了常用的数学函数。

常用数学函数

函数功能示例
abs()整数绝对值abs(-5) 返回5
fabs()浮点数绝对值fabs(-3.14) 返回3.14
pow()幂运算pow(2, 3) 返回8.0
sqrt()平方根sqrt(16) 返回4.0
ceil()向上取整ceil(3.14) 返回4.0
floor()向下取整floor(3.14) 返回3.0
sin()/cos()/tan()三角函数参数为弧度
exp()e的x次幂-
log()自然对数-
log10()以10为底的对数-

注意abs 实际上定义在 stdlib.h 中,而 fabsmath.h 中。

综合示例

 #include <stdio.h>
 #include <math.h>
 ​
 int main() {
     double x = 9.0;
     double y = 2.0;
     
     printf("平方根 sqrt(%.1f) = %.2f\n", x, sqrt(x));
     printf("幂运算 pow(%.1f, %.1f) = %.2f\n", x, y, pow(x, y));
     printf("向上取整 ceil(3.14) = %.0f\n", ceil(3.14));
     printf("向下取整 floor(3.14) = %.0f\n", floor(3.14));
     printf("绝对值 fabs(-5.5) = %.1f\n", fabs(-5.5));
     
     double angle = 3.14159 / 2;  // 90度
     printf("sin(90°) = %.2f\n", sin(angle));
     
     return 0;
 }

字符处理:ctype.h

ctype.h 提供了字符分类和转换函数。

字符分类函数

函数功能(判断字符是否为...)
isalnum()字母或数字
isalpha()字母
isdigit()数字
islower()小写字母
isupper()大写字母
isspace()空白字符(空格、制表符、换行等)
ispunct()标点符号

字符转换函数

函数功能
tolower()转换为小写
toupper()转换为大写

示例

 #include <stdio.h>
 #include <ctype.h>
 ​
 int main() {
     char ch;
     
     printf("请输入一个字符:");
     ch = getchar();
     
     if (isalpha(ch)) {
         printf("这是一个字母\n");
         if (islower(ch)) {
             printf("小写字母,转换为大写:%c\n", toupper(ch));
         } else {
             printf("大写字母,转换为小写:%c\n", tolower(ch));
         }
     } else if (isdigit(ch)) {
         printf("这是一个数字\n");
     } else if (isspace(ch)) {
         printf("这是一个空白字符\n");
     } else {
         printf("这是其他字符\n");
     }
     
     return 0;
 }

时间和日期:time.h

time.h 提供了处理时间和日期的函数。

常用时间函数

函数功能
time()获取当前日历时间
localtime()将时间转换为本地时间
ctime()将时间转换为字符串
difftime()计算时间差
clock()获取处理器时间
strftime()格式化时间

示例

 #include <stdio.h>
 #include <time.h>
 ​
 int main() {
     time_t now;
     struct tm *local;
     char buffer[80];
     
     // 获取当前时间
     time(&now);
     printf("当前时间戳:%ld\n", now);
     
     // 转换为本地时间
     local = localtime(&now);
     printf("本地时间:%s", asctime(local));
     
     // 格式化时间
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local);
     printf("格式化时间:%s\n", buffer);
     
     // 计算程序运行时间
     clock_t start = clock();
     for (int i = 0; i < 1000000; i++);  // 简单延迟
     clock_t end = clock();
     
     double cpu_time = ((double)(end - start)) / CLOCKS_PER_SEC;
     printf("CPU时间:%f秒\n", cpu_time);
     
     return 0;
 }

实用技巧和注意事项

缓冲区溢出问题

使用不安全的字符串函数(如 getsstrcpy 不加长度限制)可能导致安全问题。应优先使用带长度限制的函数(如 fgetsstrncpysnprintf 等)。

随机数的质量

rand() 产生的随机数质量有限,对于安全性要求高的场景,应使用更安全的随机数生成器。

内存管理原则

  • 谁分配,谁释放

  • 释放后立即将指针置为 NULL

  • 避免内存泄漏和野指针

结语

总结了最常用的几个头文件和函数,但 C 标准库远不止于此。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐