C 语言常用标准库函数(个人总结版)
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 中,而 fabs 在 math.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;
}
实用技巧和注意事项
缓冲区溢出问题
使用不安全的字符串函数(如 gets、strcpy 不加长度限制)可能导致安全问题。应优先使用带长度限制的函数(如 fgets、strncpy、snprintf 等)。
随机数的质量
rand() 产生的随机数质量有限,对于安全性要求高的场景,应使用更安全的随机数生成器。
内存管理原则
-
谁分配,谁释放
-
释放后立即将指针置为 NULL
-
避免内存泄漏和野指针
结语
总结了最常用的几个头文件和函数,但 C 标准库远不止于此。
更多推荐

所有评论(0)