10 KiB
10 KiB
好的,我给你整理一个比较全面的总结,把你想要的各类内容都列出来,方便你复习或者快速查阅。内容会尽量具体,包括函数、用法和返回值说明。
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 定义
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。 - 标准库函数少:没有
iostream、string类等。 - C风格字符串:
char[]+\0,而非std::string。 - 枚举默认 int 类型,没有类枚举。
- 宏和预处理器:
#define、#ifdef常用,C++ 尽量用const、inline替代。 - 函数指针使用更普遍。
6. C语言小技巧
- 安全字符串操作:
char buf[20];
fgets(buf, sizeof(buf), stdin); // 替代 gets()
- 交换两个变量:
int a=1,b=2;
a ^= b; b ^= a; a ^= b; // 不用临时变量
- 宏定义调试
#define DEBUG printf("Line:%d\n", __LINE__);
- 数组长度计算
int arr[10];
int len = sizeof(arr)/sizeof(arr[0]);
- 快速判断奇偶
if(n & 1) // 奇数
- 使用
do{ } while(0)封装宏 防止意外
#define LOG(x) do { printf("LOG: %d\n", x); } while(0)
- 指针技巧
char *p = str;
while(*p) { /* 遍历字符串 */ p++; }
- 避免魔法数字
enum { SUCCESS = 0, FAIL = -1 };
如果你需要,我可以帮你画一张 C标准库函数总表图,把 stdio.h、stdlib.h、string.h 的函数和返回值一目了然地列出来,做成速查表。
你想让我帮你画这个表吗?