Files
Data-Structure/C/readme.md
e2hang cf6451ffe7 C
2025-12-21 14:25:23 +08:00

245 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

好的,我给你整理一个比较全面的总结,把你想要的各类内容都列出来,方便你复习或者快速查阅。内容会尽量具体,包括函数、用法和返回值说明。
---
## 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` 的函数和返回值一目了然地列出来,做成速查表。
你想让我帮你画这个表吗?