C
This commit is contained in:
244
C/readme.md
Normal file
244
C/readme.md
Normal 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();` | 读取的字符(int),EOF(-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` 的函数和返回值一目了然地列出来,做成速查表。
|
||||||
|
|
||||||
|
你想让我帮你画这个表吗?
|
||||||
Reference in New Issue
Block a user