C with classes

This commit is contained in:
e2hang
2025-12-31 00:39:23 +08:00
commit a047893756
198 changed files with 11173 additions and 0 deletions

244
C/readme.md Normal file
View File

@@ -0,0 +1,244 @@
好的,我给你整理一个比较全面的总结,把你想要的各类内容都列出来,方便你复习或者快速查阅。内容会尽量具体,包括函数、用法和返回值说明。
---
## 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 定义**
```c
struct Student {
char name[50];
int age;
float score;
};
```
### **4.2 变量声明**
```c
struct Student s1; // 普通声明
struct Student s2 = {"Tom", 20, 95.5}; // 初始化
```
### **4.3 访问成员**
```c
s1.age = 21;
printf("%s\n", s1.name);
```
### **4.4 指针访问**
```c
struct Student *p = &s1;
p->age = 22; // 等价于 (*p).age = 22
```
### **4.5 嵌套结构体**
```c
struct Date {
int year, month, day;
};
struct Student {
char name[50];
struct Date birthday;
};
```
### **4.6 typedef 简化**
```c
typedef struct Student {
char name[50];
int age;
} Student;
Student s; // 可以直接用 Student
```
---
## 5. **C语言其他特性区别于 C++**
* **没有类和继承**C 只有结构体和函数组合。
* **没有函数重载**:函数名必须唯一。
* **没有引用**:只有指针传递。
* **没有命名空间**:变量和函数全局唯一。
* **动态内存手动管理**`malloc/free`,没有 `new/delete`
* **标准库函数少**:没有 `iostream``string` 类等。
* **C风格字符串**`char[]` + `\0`,而非 `std::string`
* **枚举默认 int 类型**,没有类枚举。
* **宏和预处理器**`#define``#ifdef` 常用C++ 尽量用 `const``inline` 替代。
* **函数指针使用更普遍**。
---
## 6. **C语言小技巧**
1. **安全字符串操作**
```c
char buf[20];
fgets(buf, sizeof(buf), stdin); // 替代 gets()
```
2. **交换两个变量**
```c
int a=1,b=2;
a ^= b; b ^= a; a ^= b; // 不用临时变量
```
3. **宏定义调试**
```c
#define DEBUG printf("Line:%d\n", __LINE__);
```
4. **数组长度计算**
```c
int arr[10];
int len = sizeof(arr)/sizeof(arr[0]);
```
5. **快速判断奇偶**
```c
if(n & 1) // 奇数
```
6. **使用 `do{ } while(0)` 封装宏** 防止意外
```c
#define LOG(x) do { printf("LOG: %d\n", x); } while(0)
```
7. **指针技巧**
```c
char *p = str;
while(*p) { /* 遍历字符串 */ p++; }
```
8. **避免魔法数字**
```c
enum { SUCCESS = 0, FAIL = -1 };
```
---
如果你需要,我可以帮你画一张 **C标准库函数总表图**,把 `stdio.h``stdlib.h``string.h` 的函数和返回值一目了然地列出来,做成速查表。
你想让我帮你画这个表吗?