知识树中的段错误

我在c中实现了一个可以从文件中读取的知识树。 我在newStr函数中遇到了一个seg错误。 我无法使用此问题测试其余代码。 我对c没有多少经验。 任何帮助将不胜感激。

我的.c文件#include #include #include“animal.h”#include #include

/*returns a new node for the given value*/ struct Node * newNode (char *newValue) { struct Node * tree; tree = (struct Node*)malloc(sizeof(struct Node)); tree -> value = newStr(newValue); return tree; } /* returns a new string with value passed as an argument*/ char * newStr (char * charBuffer) { int i; int length = strlen(charBuffer); char newStr; if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){ for(i=1; i left = NULL; newTree -> right = NULL; } else{ fgets(buffer, 100, f); newTree = newNode(newStr(buffer)); newTree->left = readATree(f); newTree->right = (struct Node *) readAtree(f); } return newTree; } /*Write Tree to a File*/ void writeAFile(struct Node* tree, FILE * f) { char buffer[100]; strcpy(buffer, tree->value); if(tree != 0){ if(tree->left == NULL && tree->right == NULL){ fputc((char)"A", f); fputs(buffer,f); } else{ fputc((char)"Q",f); fputs(buffer,f); writeAFile(tree->left, f); writeAFile(tree->right,f); } } } /*The play should start from here*/ int main (){ struct Node* node; struct Node* root; char ans[100]; char q[100]; FILE * f; f = fopen("animal.txt", "r+"); if(f != NULL) readATree(f); else{ node = newNode("Does it meow?"); node->right = NULL; node->right->right=NULL; node->left->left=NULL; node->left=newNode("Cat"); root = node; } while(node->left != NULL && node->right != NULL){ printf(node->value); scanf(ans); if(ans[0] == (char)"Y" || ans[0] == (char)"y") node = node->left; else if(ans[0] == (char)"N" || ans[0] == (char)"n") node = node->right; else printf("That is not a valid input.\n"); } if(ans[0] == (char)"Y" || ans[0] == (char)"y") printf("I win!"); else if(ans[0] == (char)"N" || ans[0] == (char)"n"){ printf("What is your animal"); scanf(ans); printf("Please enter a yes or no question that is true about %s?\n", ans); scanf(q); node->right = newNode(q); node->right->left = newNode(ans); node->right->right = NULL; } writeAFile(root,f); fclose(f); return 0; } 

.h文件#include

 struct Node { char *value; struct Node * left; struct Node * right; }; struct Node * newNode (char *newValue) ; char * newStr (char * charBuffer); struct Node * readATree(FILE * f); void writeAFile(struct Node* tree, FILE * f); 

可能会有更多,但这里有一些关于错误的点:

  1. 你的newStrfunction非常非常错误。 猜测你想要的东西如下:

     char * newStr (char * charBuffer) { char *newStr; if(charBuffer[0] == 'A' || charBuffer[0] == 'Q') { newStr = strdup(&charBuffer[1]); } else { newStr = strdup(""); } if(newStr == NULL) { //handle error } return newStr; } 
  2. 您不能像在此处一样将字符串转换为字符串:

      if(ans[0] == (char)"Y" || ans[0] == (char)"y") 

    请改为(同样适用于其他地方的类似代码)

      if(ans[0] =='Y' || ans[0] == 'y') 
  3. 当你调用putc时,与上面相同,不要这样做

      fputc((char)"A", f); 

      fputc('A', f); 
  4. scanf需要一个格式字符串,不要这样做:

     scanf(ans); 

    做例如(或再次使用fgets)

     if(scanf("%99s",ans) != 1) { //handle error } 
 char * newStr (char * charBuffer) { int i; int length = strlen(charBuffer); char newStr; if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){ for(i=1; i 

好吧,这里有一些有趣的东西......为了解决这个问题,你试图将字符指针的内容复制到另一个中,而这个函数不会这样做。 所有你真正要做的就是将charBuffer中每个char的值加到newStr中,因为char实际上只是一个8位整数,然后你通过隐式转换将该整数作为指针返回,所以它现在被视为一个内存地址。

你应该看看使用strdup(),正如已经指出的那样,因为这正是函数应该做的事情。 无需重新发明轮子。 🙂

作为字符串连接的“+”运算符在c中不起作用。

如果你真的想复制一个字符串,请使用strdup() 。 此函数分配内存并将字符串复制到其中。

使用它时,不要忘记释放已分配的内存。