私は C プログラミングに不慣れで、エラー スタックの破壊が検出されたという問題を解決できません。
リンクされたリストにファイルを読み取る必要があります。ファイルは次のようになります。
chicago;addie;story begins here;-----#####-----------|-----#@$.#-----------|-----#####-----------
houston;harvey;we got a problem;-----#####-----------|-----#---#-----------|-----#$--#-----------|---###--$##----------|---#--$-$-#----------|-###-#-##-#---######-|-#---#-##-#####--..#-|-#-$--$----------..#-|-#####-###-#@##--..#-|-----#-----#########-|-----#######---------
ゲーム倉庫番にはレベルがあります (各レベルは 1 行で表示されます)。
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);
}
編集:現在の問題でコードと質問を更新しました。