我正在尝试编写一个接收.txt文件的程序,读取所有行,然后将每个单词存储到BST中。然后我执行inorder遍历以按字母顺序打印单词。如果文本文件只包含1行,则程序可以正常工作,但如果文本文件包含多行,则会出现意外结果。
示例:文本文件:
first line
second line
仅输出:
line
second
完全丢失文本文件的第一行。
我的主要方法是:
#define MAX_STR_LEN 1024
int main(int argc, char** argv)
{
FILE *fptr;
fptr = fopen(argv[1], "r");
if(fptr == NULL)
{
printf("Error. Could not open file.\n");
exit(1);
}
char line[MAX_STR_LEN];
char* tok;
struct BSTnode* theRoot;
int isRoot = 1;
while(fgets(line, MAX_STR_LEN, fptr) != NULL)
{
tok = strtok(line, " \n");
while(tok != NULL)
{
if(isRoot == 1)
{
theRoot = createNode(tok); //creates the root for the BST
isRoot = 0;
}
else
{
processStr(&theRoot, tok); //places a new word into the BST
}
tok = strtok(NULL, " \n");
}
}
inorder(theRoot); //prints words alphabetically
fclose(fptr);
return 0;
}
我介入了GDB,当在while循环中第二次调用fgets时,BST的根被更改并覆盖。任何建议将不胜感激。
编辑:
struct BSTnode* createNode(char* word)
{
struct BSTnode* temp = malloc(sizeof(struct BSTnode));
temp->word = word;
temp->left = NULL;
temp->right = NULL;
return temp;
}
void processStr(struct BSTnode** root, char* word)
{
struct BSTnode** node = search(root, word);
if (*node == NULL) {
*node = createNode(word);
}
}
struct BSTnode** search(struct BSTnode** root, char* word) {
struct BSTnode** node = root;
while (*node != NULL) {
int compare = strcasecmp(word, (*node)->word);
if (compare < 0)
node = &(*node)->left;
else if (compare > 0)
node = &(*node)->right;
else
break;
}
return node;
}
答案 0 :(得分:2)
您需要复制createNode()
中的字词,尝试类似:
struct BSTnode* createNode(char* word)
{
struct BSTnode* temp = malloc(sizeof(struct BSTnode));
temp->word = malloc(strlen(word) + 1);
strcpy(temp->word, word);
temp->left = NULL;
temp->right = NULL;
return temp;
}
在createNode()
中,word
是指向line
中子字符串的指针,对fgets()
的另一次调用将覆盖此数组的内容。