在二叉树中解析和存储字符串时,程序中的Seg Fault

现在我甚至没有得到我的程序的段故障,我很确定它只是永远运行,因为当我运行程序时没有产生输出,甚至没有分段错误。 基本上我想要我的程序要做的是读取4行文件。 然后我们使用用户创建的tokenizer函数和已创建的strtok函数来解析字符串。 然后我想从读入的命令中创建一个二叉树。就像我之前说的那样,我的程序当时没有产生输出,但它确实编译了。 我将发布我拥有的代码和您读入的文件以及示例输出。 我很感激帮助。

#include #include #include #define COMMAND_NAME_LEN 50 #define MAX_SPLIT_SIZE 50 #define MAX_BUFF_SIZE 50 typedef struct Command_ { char name[COMMAND_NAME_LEN]; int expected_param_count; struct Command_ *left; struct Command_ *right; }Command; typedef struct StringArray_ { char **strings; int size; }StringArray; StringArray* tokenizer (char *string, const char* delimiters); void free_string_array(StringArray *sr); void create_commands_tree(Command **commands, const char *file); void insert_into_commands_tree(Command** node, char** data); Command* get_command(Command *node, const char *command); Command* create_command(char **data); void destroy_commands_tree(Command* node); void display_commands(Command *node); int main (int argc, char *argv[]) { if (argc strings[0]); if( c && parsed_input->size == c->expected_param_count) { if (strcmp(c->name, "quit") == 0){ checking = 0; } printf("Valid command used\n"); } else { printf("Invalid command, please try again\n"); } free_string_array(parsed_input); }while (checking); destroy_commands_tree(options); } void create_commands_tree(Command **commands, const char *file) { FILE *input; input = fopen(file, "r"); char strings[256]; Command *temp; StringArray *temp2; while(fgets(strings,100,input)){ temp2 = tokenizer(strings, "\n"); insert_into_commands_tree(&temp,temp2->strings); } } void insert_into_commands_tree(Command** node, char** data) { Command **new_ = node; if(node == NULL){ *new_ = create_command(data); } else if( new_ != NULL){ if(strcmp(data[0],(*new_)->name) left,data); else if(strcmp(data[0], (*new_)->name) > 0) insert_into_commands_tree(&(*new_)->right,data); } } Command* create_command(char **data) { Command* new_; new_ = (Command*)malloc(sizeof(Command)); strncpy(new_->name, data[0], COMMAND_NAME_LEN); new_->expected_param_count = 0; new_->right = NULL; new_->left = NULL; return new_; } Command* get_command(Command *node, const char *command) { Command *temp = node; int compare; if(temp){ compare = strcmp(node->name, command); if(compare == 0){ return temp; } else if(compare right, command)); } else{ if(compare > 0){ return (get_command(node->left, command)); }} } return temp; } void destroy_commands_tree(Command* node) { if( node == NULL){ return; } destroy_commands_tree(node->left); destroy_commands_tree(node->right); free(node); } void display_commands(Command *node) { if(node != NULL){ printf("\npickup "); printf("\nhelp "); printf("\nquit "); printf("\nload \n\n"); } } StringArray* tokenizer (char *string, const char* delimiters){ StringArray *temp = (StringArray*)malloc(sizeof(StringArray));; char *split; split = strtok(string, delimiters); while(split != NULL) { split = strtok(string, delimiters); temp->strings = &split; } return temp; } void free_string_array(StringArray *sr) { while(sr != NULL) free(sr); free(sr); } 

以下是给出的示例输出:

 ]$ ./a.out commands.dat Command: pickup Invalid command, please try again Command: pickup ball Valid command used Command: quit 1 Invalid command, please try again Command: load Invalid command, please try again Command: load bak.sav Valid command used Command: help Valid command used Command: help 2 Invalid command, please try again Command: quit Valid command used 

我们读入的文件如下:

 pickup,2 help,1 quit,1 load,2