Rafathasan 深度解析

CS3157 Advanced Programming - Lab 2 & Midterm 1

1. 前置知识

📂 头文件 vs 源文件

.h: 声明(函数原型、结构体)。
.c: 实现(函数定义)。
#include "file.h" 引入。

⌨️ 命令行参数

argc: 参数个数。
argv[0]: 程序名。
argv[1...]: 用户输入。

⚙️ 位操作

&: AND (检查/清除位)
|: OR (设置位)
<<, >>: 左移/右移

📝 字符串

'\0' 结尾的 char 数组。
strlen, strcpy, toupper

2. 工具箱

头文件 用途 关键函数
stdio.h I/O printf
stdlib.h 内存/转换 malloc, free, atoi
string.h 字符串 strlen
ctype.h 字符 toupper

3. 文件详解

Lab 2: Part 1 - convert.c

进制转换

使用位操作将整数转换为二进制字符串。

for(unsigned i = (1 << 31); i > 0; i /= 2) {
    if(i & x) binary[k++] = '1';
    else binary[k++] = '0';
}

关键技巧: i & x 检查 x 的第 i 位是否为 1。

Lab 2: Part 2 - twecho.c

参数复制与大写

双重 malloc: 先分配指针数组,再分配每个字符串。

while ((*t++ = toupper(*s++)) != 0);

习语: 同时复制和转换,直到遇到 '\0'。

Midterm 1 - rank.c

位掩码操作

return x | 0x12;  // 设置第 1 位和第 4 位

0x12 = 00010010。OR 操作将这些位设置为 1。

输入 x x (二进制) 结果
2 0000 0010 18 (0001 0010)
0 0000 0000 18

4. 条件反射

🚨 malloc 后没检查 NULL
反射: if (ptr == NULL) { perror(...); exit(1); }
📝 看到 while((*t++ = *s++) != 0)
反射: 这是 C 语言的字符串复制习语。赋值表达式的值是被赋的值。
⚙️ 看到 x | 0x.. 或 x & 0x..
反射: 位掩码!OR 用于设置位,AND 用于检查/清除位。