C语言期末考试速查手册
一、输入输出技巧
1. 多种输入方式
// 1. 基础输入int n;scanf("%d", &n);
// 2. 字符串输入(无空格)char str[20];scanf("%s", str); // 遇到空格停止
// 3. 字符串输入(含空格)char str[100];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] = '\0'; // 去掉换行符
// 4. 读取整行直到换行符char line[100];scanf("%[^\n]", line); // 读取直到换行符getchar(); // 吃掉换行符2. 格式化输出
// 控制宽度和对齐printf("%-10s %5d\n", "Name", 100); // 左对齐,宽度10printf("%10s %5d\n", "Name", 100); // 右对齐,宽度10printf("%.2f\n", 3.14159); // 保留2位小数printf("%05d\n", 42); // 补零到5位:00042二、字符串处理
1. 常用函数
#include <string.h>
// 长度int len = strlen(str);
// 复制strcpy(dest, src); // 不安全,可能溢出strncpy(dest, src, n); // 安全,最多复制n个字符
// 连接strcat(dest, src); // 不安全strncat(dest, src, n); // 安全
// 比较int cmp = strcmp(s1, s2); // 相等返回0,s1>s2返回正数int cmp = strncmp(s1, s2, n); // 比较前n个字符
// 查找char *p = strchr(str, 'a'); // 查找字符第一次出现char *p = strrchr(str, 'a'); // 查找字符最后一次出现char *p = strstr(str, "abc"); // 查找子串2. 字符串分割
// 方法1:strtokchar str[] = "apple,banana,orange";char *token = strtok(str, ",");while (token != NULL) { printf("%s\n", token); token = strtok(NULL, ",");}
// 方法2:sscanfchar data[] = "John 25 85.5";char name[20];int age;float score;sscanf(data, "%s %d %f", name, &age, &score);3. 字符串转换
#include <stdlib.h>
// 字符串转数字int num = atoi("123"); // ASCII to integerlong lnum = atol("123456"); // ASCII to longfloat fnum = atof("3.14"); // ASCII to float
// 更安全的转换int num = strtol(str, NULL, 10); // 10表示十进制float fnum = strtof(str, NULL);
// 数字转字符串char buffer[20];sprintf(buffer, "%d", 123); // 整数转字符串sprintf(buffer, "%.2f", 3.14159); // 浮点数转字符串三、数组操作
1. 一维数组
// 遍历int arr[10];for (int i = 0; i < 10; i++) { arr[i] = i * 2;}
// 逆序void reverse(int arr[], int n) { for (int i = 0; i < n / 2; i++) { int temp = arr[i]; arr[i] = arr[n-1-i]; arr[n-1-i] = temp; }}
// 查找最大最小值void find_min_max(int arr[], int n, int *min, int *max) { *min = *max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < *min) *min = arr[i]; if (arr[i] > *max) *max = arr[i]; }}2. 二维数组
// 遍历int matrix[3][4];for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { matrix[i][j] = i * 4 + j; }}
// 矩阵转置void transpose(int src[][N], int dest[][M], int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { dest[j][i] = src[i][j]; } }}四、结构体与指针
1. 结构体定义与使用
// 定义typedef struct { char name[20]; int age; float score;} Student;
// 初始化Student s1 = {"Alice", 20, 85.5};Student s2;strcpy(s2.name, "Bob");s2.age = 21;s2.score = 90.0;
// 结构体数组Student class[30];for (int i = 0; i < 30; i++) { scanf("%s %d %f", class[i].name, &class[i].age, &class[i].score);}2. 指针操作
// 基本指针int a = 10;int *p = &a;printf("%d\n", *p); // 输出10
// 指针与数组int arr[5] = {1,2,3,4,5};int *ptr = arr; // ptr指向arr[0]printf("%d\n", *(ptr+2)); // 输出arr[2]=3
// 结构体指针Student s;Student *sp = &s;sp->age = 20; // 等价于 (*sp).age = 20五、动态内存管理
#include <stdlib.h>
// 一维数组int *arr = (int*)malloc(n * sizeof(int));if (arr == NULL) { printf("内存分配失败\n"); exit(1);}// 使用...free(arr);
// 二维数组int **matrix = (int**)malloc(rows * sizeof(int*));for (int i = 0; i < rows; i++) { matrix[i] = (int*)malloc(cols * sizeof(int));}// 使用...for (int i = 0; i < rows; i++) { free(matrix[i]);}free(matrix);六、常用算法模板
1. 排序算法
// 冒泡排序void bubble_sort(int arr[], int n) { for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-1-i; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }}
// 选择排序void selection_sort(int arr[], int n) { for (int i = 0; i < n-1; i++) { int min_idx = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } int temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; }}
// 插入排序void insertion_sort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i-1; while (j >= 0 && arr[j] > key) { arr[j+1] = arr[j]; j--; } arr[j+1] = key; }}2. 查找算法
// 顺序查找int linear_search(int arr[], int n, int target) { for (int i = 0; i < n; i++) { if (arr[i] == target) { return i; } } return -1;}
// 二分查找(要求数组有序)int binary_search(int arr[], int n, int target) { int left = 0, right = n-1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1;}七、数学计算
1. 常用数学函数
#include <math.h>
// 绝对值int a = abs(-10); // 整数绝对值double b = fabs(-3.14); // 浮点数绝对值
// 幂运算double result = pow(2, 3); // 2³ = 8double sqrt_val = sqrt(16); // √16 = 4
// 三角函数(参数为弧度)double sin_val = sin(3.14159/2); // sin(90°) = 1double cos_val = cos(0); // cos(0°) = 1
// 对数double log_e = log(2.71828); // 自然对数lndouble log_10 = log10(100); // 以10为底
// 取整double ceil_val = ceil(3.14); // 向上取整 = 4double floor_val = floor(3.14); // 向下取整 = 3double round_val = round(3.5); // 四舍五入 = 42. 最大公约数与最小公倍数
// 辗转相除法求最大公约数int gcd(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a;}
// 最小公倍数int lcm(int a, int b) { return a / gcd(a, b) * b; // 先除后乘防止溢出}3. 素数判断
#include <math.h>
int is_prime(int n) { if (n <= 1) return 0; if (n == 2) return 1; if (n % 2 == 0) return 0;
for (int i = 3; i <= sqrt(n); i += 2) { if (n % i == 0) return 0; } return 1;}八、文件操作
1. 基本文件操作
#include <stdio.h>
// 打开文件FILE *fp = fopen("data.txt", "r"); // 模式:r(读), w(写), a(追加)
if (fp == NULL) { printf("打开文件失败\n"); return 1;}
// 读写操作fprintf(fp, "Hello %d\n", 123); // 写入格式化数据fscanf(fp, "%s %d", str, &num); // 读取格式化数据
fputs("Hello\n", fp); // 写入字符串fgets(buffer, sizeof(buffer), fp); // 读取一行
char ch = fgetc(fp); // 读取一个字符fputc('A', fp); // 写入一个字符
// 关闭文件fclose(fp);2. 常用文件操作模式
| 模式 | 描述 |
|---|---|
| ”r” | 只读,文件必须存在 |
| ”w” | 只写,创建新文件/清空原有文件 |
| ”a” | 追加,在文件末尾添加 |
| ”r+“ | 读写,文件必须存在 |
| ”w+“ | 读写,创建新文件/清空原有文件 |
| ”a+“ | 读写,在文件末尾添加 |
九、实用技巧
1. 清除输入缓冲区
// 清除所有残留字符void clear_input_buffer() { int c; while ((c = getchar()) != '\n' && c != EOF);}
// 使用示例int n;scanf("%d", &n);clear_input_buffer(); // 清除换行符2. 交换两个数
// 方法1:使用临时变量void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp;}
// 方法2:不使用临时变量(仅整数)void swap_xor(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b;}3. 生成随机数
#include <stdlib.h>#include <time.h>
// 初始化随机种子(只需调用一次)srand(time(NULL));
// 生成随机数int random_num = rand(); // 0到RAND_MAX之间int range_random = rand() % 100; // 0-99int min_max_random = 10 + rand() % 91; // 10-100十、常见错误与调试
1. 编译错误
// 错误1:未声明的标识符printf("%d\n", x); // 如果x未声明
// 错误2:类型不匹配int *p = 10; // 应该:int *p = &a;
// 错误3:缺少分号int a = 10 // 缺少分号2. 运行时错误
// 错误1:数组越界int arr[5];arr[5] = 10; // 越界访问
// 错误2:除零错误int result = 10 / 0;
// 错误3:使用未初始化指针int *p;*p = 10; // 野指针
// 错误4:内存泄漏int *p = malloc(100);// 忘记free(p);3. 调试技巧
// 1. 使用printf调试printf("调试:a=%d, b=%d\n", a, b);
// 2. 条件编译调试#ifdef DEBUG printf("调试信息:x=%d\n", x);#endif
// 编译时:gcc -DDEBUG program.c
// 3. 使用assert#include <assert.h>assert(x > 0); // 如果x<=0,程序会终止并报错 Thanks for reading!
