Files
Data-Structure/C
2025-12-28 16:11:38 +08:00
..
2025-12-28 16:11:38 +08:00
SDL
2025-12-26 15:16:56 +08:00
C
2025-12-23 20:08:44 +08:00
C
2025-12-21 14:25:23 +08:00
C
2025-12-23 20:08:44 +08:00

好的,我给你整理一个比较全面的总结,把你想要的各类内容都列出来,方便你复习或者快速查阅。内容会尽量具体,包括函数、用法和返回值说明。


1. C语言 <stdio.h> 函数总结

stdio.h 是标准输入输出库,主要用于控制台和文件的输入输出。常用函数如下:

1.1 标准输入输出

函数 用法 返回值 说明
printf printf("format", args...) 输出字符数 格式化输出到屏幕
scanf scanf("format", &var...) 成功匹配输入项数 从标准输入读取数据
getchar int c = getchar(); 读取的字符intEOF(-1) 表示结束 从 stdin 读取一个字符
putchar putchar(c); 输出字符,返回输出的字符 输出一个字符到 stdout
gets (已废弃) char str[100]; gets(str); 返回 str 地址 从 stdin 读取一行,不安全
puts puts(str); 非负数表示成功 输出字符串并换行

1.2 文件操作

函数 用法 返回值 说明
fopen FILE *fp = fopen("file","mode"); 文件指针 打开文件,模式如 "r","w","a","rb","wb"
fclose fclose(fp); 0 成功EOF 失败 关闭文件
fgetc c = fgetc(fp); 读取字符EOF 表示结束 从文件读取字符
fputc fputc(c, fp); 输出字符 向文件写入字符
fgets fgets(buf, n, fp); buf地址EOF/NULL 表示失败 从文件读取一行
fputs fputs(str, fp); 非负数成功 向文件写入字符串
fprintf fprintf(fp, "format", args...); 输出字符数 格式化输出到文件
fscanf fscanf(fp, "format", &var...); 成功匹配输入项数 从文件读取格式化数据
feof feof(fp) 非零表示 EOF 检测是否到文件末尾
ferror ferror(fp) 非零表示出错 检测文件错误

1.3 其他

函数 用法 返回值 说明
rewind rewind(fp); void 文件指针回到开头
ftell long pos = ftell(fp); 当前偏移量 获取文件当前位置
fseek fseek(fp, offset, origin); 0成功非0失败 文件指针移动
clearerr clearerr(fp); void 清除错误标志和 EOF 标志

2. C语言 <stdlib.h> 函数总结

stdlib.h 主要是通用工具函数,包括动态内存、随机数、程序控制等。

2.1 动态内存管理

函数 用法 返回值 说明
malloc ptr = malloc(n); 指针NULL 表示失败 分配 n 字节内存
calloc ptr = calloc(n, size); 指针NULL 表示失败 分配 n 个 size 大小的内存,初始化为 0
realloc ptr = realloc(ptr, new_size); 指针NULL 表示失败 重新分配内存
free free(ptr); void 释放内存

2.2 程序控制

函数 用法 返回值 说明
exit exit(status); void 终止程序status 通常 0 表示成功
atexit atexit(func); 0成功 注册程序结束时执行的函数

2.3 字符转换与数学

函数 用法 返回值 说明
atoi int x = atoi(str); 转换整数 字符串转 int
atof double d = atof(str); 转换浮点 字符串转 double
atol long l = atol(str); 转换长整数 字符串转 long
strtol long l = strtol(str, &endptr, base); long 更安全的字符串转 long
rand int r = rand(); 0~RAND_MAX 生成随机数
srand srand(seed); void 设置随机数种子

3. C语言 <string.h> 函数总结

string.h 主要处理字符串和内存块操作,是 C 编程重点。

3.1 字符串操作

函数 用法 返回值 说明
strlen size_t n = strlen(str); 字符数,不含 \0 计算字符串长度
strcpy strcpy(dest, src); dest 字符串拷贝
strncpy strncpy(dest, src, n); dest 拷贝前 n 个字符,未自动加 '\0'
strcat strcat(dest, src); dest 拼接字符串
strncat strncat(dest, src, n); dest 拼接前 n 个字符
strcmp strcmp(s1, s2); <0 s1<s2, 0=s1=s2, >0 s1>s2 比较字符串
strncmp strncmp(s1, s2, n); 同上 比较前 n 个字符
strchr char *p = strchr(str, c); 指向首次出现的字符 查找字符
strrchr char *p = strrchr(str, c); 指向最后一次出现的字符 查找字符
strstr char *p = strstr(hay, needle); 指向首次出现的子串 查找子串
strspn size_t n = strspn(str, set); 长度 前面连续匹配 set 的长度
strcspn size_t n = strcspn(str, set); 长度 前面连续不含 set 的长度
strpbrk char *p = strpbrk(str, set); 指向首次匹配字符 查找任意字符

3.2 内存操作

函数 用法 返回值 说明
memset memset(ptr, val, n); ptr 设置内存 n 个字节为 val
memcpy memcpy(dest, src, n); dest 内存拷贝 n 字节
memmove memmove(dest, src, n); dest 内存拷贝 n 字节,允许重叠
memcmp memcmp(p1, p2, n); <0 p1<p2,0=p1=p2,>0 p1>p2 内存比较 n 字节

重点C 里的字符串是以 \0 结尾的字符数组,所以要注意边界和 '\0' 的处理。


4. C语言结构体使用

4.1 定义

struct Student {
    char name[50];
    int age;
    float score;
};

4.2 变量声明

struct Student s1;           // 普通声明
struct Student s2 = {"Tom", 20, 95.5}; // 初始化

4.3 访问成员

s1.age = 21;
printf("%s\n", s1.name);

4.4 指针访问

struct Student *p = &s1;
p->age = 22; // 等价于 (*p).age = 22

4.5 嵌套结构体

struct Date {
    int year, month, day;
};
struct Student {
    char name[50];
    struct Date birthday;
};

4.6 typedef 简化

typedef struct Student {
    char name[50];
    int age;
} Student;
Student s; // 可以直接用 Student

5. C语言其他特性区别于 C++

  • 没有类和继承C 只有结构体和函数组合。
  • 没有函数重载:函数名必须唯一。
  • 没有引用:只有指针传递。
  • 没有命名空间:变量和函数全局唯一。
  • 动态内存手动管理malloc/free,没有 new/delete
  • 标准库函数少:没有 iostreamstring 类等。
  • C风格字符串char[] + \0,而非 std::string
  • 枚举默认 int 类型,没有类枚举。
  • 宏和预处理器#define#ifdef 常用C++ 尽量用 constinline 替代。
  • 函数指针使用更普遍

6. C语言小技巧

  1. 安全字符串操作
char buf[20];
fgets(buf, sizeof(buf), stdin); // 替代 gets()
  1. 交换两个变量
int a=1,b=2;
a ^= b; b ^= a; a ^= b; // 不用临时变量
  1. 宏定义调试
#define DEBUG printf("Line:%d\n", __LINE__);
  1. 数组长度计算
int arr[10];
int len = sizeof(arr)/sizeof(arr[0]);
  1. 快速判断奇偶
if(n & 1) // 奇数
  1. 使用 do{ } while(0) 封装宏 防止意外
#define LOG(x) do { printf("LOG: %d\n", x); } while(0)
  1. 指针技巧
char *p = str;
while(*p) { /* 遍历字符串 */ p++; }
  1. 避免魔法数字
enum { SUCCESS = 0, FAIL = -1 };

如果你需要,我可以帮你画一张 C标准库函数总表图,把 stdio.hstdlib.hstring.h 的函数和返回值一目了然地列出来,做成速查表。

你想让我帮你画这个表吗?