C语言标准库(Standard Library)提供了一系列预定义的函数、类型和宏,极大地扩展了C语言的能力。 标准库涵盖了输入输出、字符串处理、数学计算、内存管理、时间日期等各个方面。 熟练掌握这些常用函数,可以显著提高编程效率,避免重复造轮子。本章将分类介绍最常用的标准库函数及其使用方法。
<stdio.h> 是最常用的头文件,提供了文件操作和标准输入输出函数。
| 函数 | 功能 | 示例 |
|---|---|---|
printf | 格式化输出到stdout | printf("x=%d\n", x); |
scanf | 从stdin格式化输入 | scanf("%d", &x); |
putchar | 输出单个字符 | putchar('A'); |
getchar | 读取单个字符 | int ch = getchar(); |
puts | 输出字符串并换行 | puts("Hello"); |
gets | ⚠️ 不安全,已废弃 | 使用 fgets 替代 |
| 函数 | 功能 | 示例 |
|---|---|---|
fopen | 打开文件 | FILE *fp = fopen("a.txt", "r"); |
fclose | 关闭文件 | fclose(fp); |
fprintf | 格式化写入文件 | fprintf(fp, "%d", x); |
fscanf | 从文件格式化读取 | fscanf(fp, "%d", &x); |
fputc | 写入字符 | fputc('A', fp); |
fgetc | 读取字符 | int ch = fgetc(fp); |
fputs | 写入字符串 | fputs("Hello", fp); |
fgets | 安全读取一行 | fgets(buf, sizeof(buf), fp); |
fread | 二进制读 | fread(data, sizeof(int), 10, fp); |
fwrite | 二进制写 | fwrite(data, sizeof(int), 10, fp); |
fseek | 移动文件位置 | fseek(fp, 0, SEEK_SET); |
ftell | 获取当前文件位置 | long pos = ftell(fp); |
rewind | 回到文件开头 | rewind(fp); |
<stdlib.h> 提供了内存管理、随机数、字符串转换、程序退出等函数。
void *malloc(size_t size); // 分配内存
void *calloc(size_t nmemb, size_t size); // 分配并清零
void *realloc(void *ptr, size_t size); // 重新分配
void free(void *ptr); // 释放内存
int rand(void); // 返回0到RAND_MAX之间的伪随机数
void srand(unsigned int seed); // 设置随机数种子
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 用当前时间作为种子
int r = rand() % 100; // 生成0-99的随机数
printf("随机数: %d\n", r);
return 0;
}
| 函数 | 功能 | 示例 |
|---|---|---|
atoi | 字符串转int | int n = atoi("123"); |
atol | 字符串转long | long l = atol("123456"); |
atof | 字符串转double | double d = atof("3.14"); |
strtol | 字符串转long(可检测错误) | char *end; long val = strtol("123abc", &end, 10); |
strtod | 字符串转double | double d = strtod("3.14", NULL); |
void exit(int status); // 终止程序,返回状态码
void abort(void); // 异常终止
int system(const char *cmd); // 执行系统命令
system("cls"); // Windows清屏
system("clear"); // Linux清屏
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
| 函数 | 功能 | 示例 |
|---|---|---|
strlen | 求字符串长度 | size_t len = strlen("abc"); |
strcpy | 复制字符串(不安全) | strcpy(dest, src); |
strncpy | 限制长度复制 | strncpy(dest, src, n); dest[n-1]='\0'; |
strcat | 拼接字符串(不安全) | strcat(dest, src); |
strncat | 限制长度拼接 | strncat(dest, src, n); |
strcmp | 比较字符串 | if (strcmp(s1, s2) == 0) ... |
strncmp | 限制长度比较 | strncmp(s1, s2, 3); |
strchr | 查找字符首次出现 | char *p = strchr(str, 'c'); |
strrchr | 查找字符最后一次出现 | char *p = strrchr(str, 'c'); |
strstr | 查找子串 | char *p = strstr(str, "abc"); |
strtok | 字符串分割 | char *token = strtok(str, ","); |
memset | 设置内存块值 | memset(arr, 0, sizeof(arr)); |
memcpy | 内存复制 | memcpy(dest, src, n); |
memmove | 内存复制(处理重叠) | memmove(dest, src, n); |
memcmp | 比较内存块 | if (memcmp(a, b, n) == 0) ... |
使用 math.h 中的函数时,编译时需要链接数学库:gcc prog.c -lm(Linux/macOS)。
| 函数 | 功能 | 示例 |
|---|---|---|
sin, cos, tan | 三角函数(弧度) | double s = sin(3.14159/2); |
asin, acos, atan | 反三角函数 | double a = asin(1.0); |
exp, log, log10 | 指数、自然对数、常用对数 | double e = exp(1.0); |
pow | 幂函数 | double p = pow(2.0, 3.0); // 8.0 |
sqrt | 平方根 | double s = sqrt(16.0); // 4.0 |
fabs | 浮点数绝对值 | double a = fabs(-3.14); |
ceil, floor | 向上取整、向下取整 | ceil(3.2) → 4.0, floor(3.2) → 3.0 |
fmod | 浮点数取余 | double r = fmod(5.5, 2.0); // 1.5 |
这些函数用于判断字符类型和转换大小写。
| 函数 | 功能 | 示例 |
|---|---|---|
isalnum | 字母或数字 | if (isalnum(ch)) ... |
isalpha | 字母 | if (isalpha(ch)) ... |
isdigit | 数字 | if (isdigit(ch)) ... |
islower | 小写字母 | if (islower(ch)) ... |
isupper | 大写字母 | if (isupper(ch)) ... |
isspace | 空白字符(空格、换行、制表等) | if (isspace(ch)) ... |
ispunct | 标点符号 | if (ispunct(ch)) ... |
tolower | 转换为小写 | char c = tolower('A'); |
toupper | 转换为大写 | char c = toupper('a'); |
#include <ctype.h>
#include <stdio.h>
int main() {
char str[] = "Hello, World! 123";
for (int i = 0; str[i]; i++) {
if (isalpha(str[i]))
putchar(toupper(str[i]));
else
putchar(str[i]);
}
// 输出:HELLO, WORLD! 123
return 0;
}
#include <stdio.h>
#include <time.h>
int main() {
// 获取当前时间戳(秒)
time_t t = time(NULL);
printf("当前时间戳: %ld\n", t);
// 转换为本地时间字符串
struct tm *tm = localtime(&t);
printf("本地时间: %s", asctime(tm));
// 格式化输出时间
char buf[64];
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
printf("格式化时间: %s\n", buf);
// 计算程序运行时间
clock_t start = clock();
// 模拟耗时操作
for (volatile int i = 0; i < 100000000; i++);
clock_t end = clock();
printf("耗时: %.2f 秒\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
clock() 测量的是CPU时间,而非真实流逝时间。如果需要高精度计时,可使用平台相关函数。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "用法: %s 源文件 目标文件\n", argv[0]);
return 1;
}
FILE *src = fopen(argv[1], "rb");
if (src == NULL) {
perror("打开源文件失败");
return 1;
}
FILE *dst = fopen(argv[2], "wb");
if (dst == NULL) {
perror("创建目标文件失败");
fclose(src);
return 1;
}
char buffer[4096];
size_t bytes;
while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
fwrite(buffer, 1, bytes, dst);
}
fclose(src);
fclose(dst);
printf("复制完成\n");
return 0;
}
strcpy、strcat 等不安全函数时,务必确保目标缓冲区足够大。优先使用 strncpy、strncat、snprintf。-lm 选项。srand(time(NULL)) 设置种子。fopen、fread、fwrite 等应检查返回值,避免使用无效文件指针。sizeof 返回数组占用的字节数,strlen 返回字符串长度(不含'\0')。gets 已被C11废弃,因为它无法防止缓冲区溢出,应使用 fgets。标准库是C语言的宝藏,熟练掌握常用函数可以事半功倍。建议多查阅C标准库文档(如cppreference.com),并亲手编写示例程序加深理解。 至此,C语言核心内容已基本覆盖,后续可结合项目实践进一步提升。