好的,我给你整理一个比较全面的总结,把你想要的各类内容都列出来,方便你复习或者快速查阅。内容会尽量具体,包括函数、用法和返回值说明。 --- ## 1. **C语言 `` 函数总结** `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` 主要是通用工具函数,包括动态内存、随机数、程序控制等。 ### **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` 主要处理字符串和内存块操作,是 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 s10 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 p10 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` 的函数和返回值一目了然地列出来,做成速查表。 你想让我帮你画这个表吗?