CS61c Spring2022 Project1
CS61C Spring2022 Project1 Guide
1. task1
task1给的row 和 column 是从0开始的,不需要再-1
2. 二维数组两种表示
1 |
|
首先在C 里面,
1 |
|
可以表示:
- 字符串
1 |
|
- 字符数组
那么,**char board 可以看出一个字符指针型数组,数组中的每个元素都是 *char, 每个 *char又可以指向一个一维字符数组, 因此
1 |
|
相当于二维字符数组
其二是
1 |
|
是一个*char 型数组,arr数组里面的元素都是 *char类型
3. 注意如何为二维pointer to pointer to char数组board分配malloc的空间
对于二维数组,不能直接执行:
1 |
|
而是要一步一步的,先把它当成一维指针型数组,为其分配一维数组的空间:
1 |
|
然后再为该指针数组里面的每个元素分配空间,每个元素都指向一个新的char 数组:
1 |
|
4. task2
task2 注意二维数组,每个元素都是一维数组,要分别free每个元素,否则 会造成内存泄漏:
5. segmentation fault的原因
- 数组越界
- 访问不存在的内存空间(未分配)
6.踩坑点
这里比较坑的一点是
row 是相当于y坐标,column相当于横坐标,对于board[ ][ ]二维数组,访问写成board[y][x] 而不是board [x][y]
如果蛇死了,立即将头替换为’x’即可
7. task 5
文件输入流,太难了,文件没学好,实际上就是让你从文件中将 长方形board二维数组 读入
game->board,并设置好x_size和y_size,然后返回*game
这一步我使用的是 fgets() ,由于你不知道文件里面的长方形矩阵有多少个字符,也不知道board数组有多少行,无法用malloc精确开辟空间,但是这里fgets又需要你传入特定大小作为参数,况且如果不事先开辟board的空间如何使用board $[i][j] $ ? 因此此处使用一个固定大小的缓存buffer数组,和向fgets()传入一个固定大小参数
1 |
|
参数
- str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
同时可打印buffer数组核对是否读入成功
1 |
|
8. task 7 关于函数指针 pointer to function 的传参
参见 https://www.geeksforgeeks.org/function-pointer-in-c/
1 |
|
1 |
|
成功完成所有本地测试:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!