1+ //禁用fscanf的警告.因为在文件无误的情况下不存在问题,所以不需要警告.
2+ #pragma clang diagnostic push
3+ #pragma ide diagnostic ignored "cert-err34-c"
14//推箱子小游戏 Powered By LanYun
25#include <ncurses.h> //对于代码内容关于ncurses.h库那些函数不太明白可以看看我写的[这篇文章](https://lanyundev.vercel.app/posts/a5945d21.html)噢
36#include <stdlib.h> //声明了数值与字符串转换函数, 伪随机数生成函数, 动态内存分配函数, 进程控制函数等公共函数.
@@ -62,7 +65,7 @@ long Latest_Level = 1;//最新关卡
6265long Total_Level = 14 ;//总关卡数
6366long Remain_Box = 1 ;//剩余箱子数
6467long Tmp = 0 ;//用于存储临时Level
65- int check = 0 ;//退出标识的作用,及其检测是否有撤回操作
68+ int check ;//退出标识的作用,及其检测是否有撤回操作
6669int x , y ;//玩家位置
6770int ch ;//获取输入内容
6871time_t Level_start , Level_end ;//记录关卡开始和结束时间
@@ -102,10 +105,10 @@ void Init() {
102105 FILE_FIX :
103106 sleep (0 );//等待0秒
104107 FILE * fp = fopen ("data.txt" , "r" );//只读打开data.txt文件📃
105- if (fp == NULL ) {//如果打开失败
108+ if (fp == NULL || check == 4 ) {//如果打开失败
106109 box (PushBox , 0 , 0 );//创建box窗口
107110 wrefresh (PushBox );//使box窗口生效
108- mvprintw (offset_y + WORLD_HEIGHT / 2 - 6 , offset_x + 8 , "未能打开或不存在data.txt数据文件 !" );
111+ mvprintw (offset_y + WORLD_HEIGHT / 2 - 6 , offset_x + 7 , "未能打开或data.txt数据文件存在错误 !" );
109112 mvprintw (offset_y + WORLD_HEIGHT / 2 - 4 , offset_x + 8 , "尝试自动生成默认data.txt数据文件!" );
110113 refresh (); //将虚拟屏幕上的内容写到显示屏上,并且刷新窗口
111114 fclose (fp );//关闭文件📃
@@ -116,9 +119,15 @@ void Init() {
116119 sleep (1 );//等待1秒
117120 goto FILE_FIX ;//重新回到只读打开
118121 }
119- fscanf (fp , "Top_Level:%ld Latest_Level:%ld" , & Top_Level , & Latest_Level );//读取文件.⚠️:此处,处在一处安全🔐性警告⚠️,但因无能修复而不得不使用。
122+ if (fscanf (fp , "Top_Level:%ld Latest_Level:%ld" , & Top_Level , & Latest_Level ) !=
123+ 2 ) { //读取文件.⚠️:此处,处在一处安全🔐性警告⚠️,但因无能修复而不得不使用。
124+ check = 4 ;//标志为文件📃需重新生成
125+ goto FILE_FIX ;
126+ }
120127 fclose (fp );//关闭文件📃
121128
129+ check = 0 ;//check标志置零
130+
122131 //检查最高数据是否异常
123132 if (Top_Level < 1 || Top_Level > Total_Level ) {
124133 box (PushBox , 0 , 0 );//创建box窗口
@@ -278,17 +287,20 @@ Position *Draw(Position *p) {
278287 //读入地图,并将地图中的数字转换为字符,存入地图数组中,方便绘制。
279288 FILE * fp = fopen ("map.txt" , "r" );//打开文件
280289 if (fp == NULL ) {
290+ FILE_Error :
281291 box (PushBox , 0 , 0 );//创建box窗口
282292 wrefresh (PushBox );//使box窗口生效
283- mvprintw (offset_y + WORLD_HEIGHT / 2 - 6 , offset_x + 10 , "未能打开或不存在map.txt地图文件 !" );
293+ mvprintw (offset_y + WORLD_HEIGHT / 2 - 6 , offset_x + 7 , "未能打开或map.txt地图文件存在错误 !" );
284294 refresh (); //将虚拟屏幕上的内容写到显示屏上,并且刷新窗口
285295 sleep (1 );//等待1秒
286296 exit (1 );
287297 }
288298 fseek (fp , (16L * 8 + 1 ) * (Level - 1 ), SEEK_SET );//移动文件指针
289299 for (int i = 0 ; i < HEIGHT ; i ++ ) {
290300 for (int j = 0 ; j < WIDTH ; j ++ ) {
291- fscanf (fp , "%1d" , & map [i ][j ]); //读取文件.⚠️:此处,处在一处安全🔐性警告⚠️,但因无能修复而不得不使用。
301+ if (fscanf (fp , "%1d" , & map [i ][j ]) != 1 ) { //读取文件.⚠️:此处,处在一处安全🔐性警告⚠️,但因无能修复而不得不使用。
302+ goto FILE_Error ;
303+ }
292304 }
293305 }
294306 fclose (fp );//关闭文件
@@ -849,3 +861,5 @@ Position *moveBack(Position *head, Position *p) {
849861
850862
851863
864+
865+ #pragma clang diagnostic pop
0 commit comments