我是 C 编程新手,我无法解决检测到错误堆栈粉碎的问题
我需要将文件读取到链表。该文件如下所示:
chicago;addie;story begins here;-----#####-----------|-----#@$.#-----------|-----#####-----------
houston;harvey;we got a problem;-----#####-----------|-----#---#-----------|-----#$--#-----------|---###--$##----------|---#--$-$-#----------|-###-#-##-#---######-|-#---#-##-#####--..#-|-#-$--$----------..#-|-#####-###-#@##--..#-|-----#-----#########-|-----#######---------
游戏推箱子有关卡,(每关取一条线)
我需要使用load_levels()
将所有级别加载到链表的函数,另一个parse_level()
接收一个级别作为参数并解析级别的函数
有人可以帮忙吗?它在 load_levels 中失败(它在源代码中用注释标记)
有我的源代码:
#include <stdlib.h>
#include <stdio.h>
#include <curses.h>
#include <unistd.h>
#include <string.h>
typedef struct level{
char name[50];
char password[50];
char description[100];
char map[200];
struct level *next_level;
}LEVEL;
LEVEL* parse_level(char *string) {
char level_name[50];
char level_password[50];
char level_descrition[100];
char level_map[200];
int i = 0;
int j = 0;
while (string[i] != ';') {
level_name[j] = string[i];
i++;
j++;
}
j = 0;
while (string[i] != ';') {
level_password[j] = string[i];
i++;
j++;
}
j = 0;
while (string[i] != ';') {
level_descrition[j] = string[i];
i++;
j++;
}
j = 0;
while (string[i] != '\0') {
level_map[j] = string[i];
i++;
j++;
}
j = 0;
LEVEL *current;
current = (LEVEL *) malloc(sizeof (LEVEL));
if (current != NULL) {
strncpy(current->name, level_name, strlen(level_name) + 1);
strncpy(current->description, level_descrition, strlen(level_descrition) + 1);
strncpy(current->password, level_password, strlen(level_password) + 1);
strncpy(current->map, level_map, strlen(level_map) + 1);
current->next_level = NULL;
}
return (current);
}
LEVEL* load_levels(char* file_path) {
FILE *fr;
fr = fopen(file_path, "r");
if (fr == NULL) {
printw("ERROR: file no open\n");
refresh();
usleep(1000000);
exit(EXIT_FAILURE);
}
LEVEL *current;
LEVEL *first;
#define MAX 1000
char one_line[MAX];
fgets(one_line, MAX, fr);
first = current = parse_level(one_line);
while (fgets(one_line, MAX, fr) != NULL) {
printw("5");
refresh();
usleep(1000000);
// here it fails - stack smashing detected.
current->next_level = parse_level(one_line);
printw("6");
refresh();
usleep(1000000);
current = current->next_level;
current->next_level = NULL;
}
fclose(fr);
return (first);
}
编辑:我更新了当前问题的代码和问题。