无法精确定位分段故障

时间:2010-07-30 15:48:48

标签: c tree

  

可能重复:
  Seg Fault in Knowledge Tree

我无法在信息树中查明我的seg错误。如果文件不存在,它应该从文件读取或获取用户输入。它应该根据是或否问题来猜测动物。我对c的经验有限,所以任何帮助都会非常感激。

.c文件

#include<stdio.h>
#include<stdlib.h>
#include"animal.h"
#include<string.h>
#include<assert.h>

/*returns a new node for the given value*/
struct Node * newNode (char *newValue) 
{
 printf("Node test");
 struct Node * tree;
 tree = (struct Node*)malloc(sizeof(struct Node));
 tree -> value = newStr(newValue);
 printf("Node test");
 return tree;
}


/* returns a new string with value passed as an argument*/
char * newStr (char * charBuffer)
{
 printf("Str test");
 char *newstr;
 if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){
   newstr = strdup(&charBuffer[1]); 
 }else{
  newstr = strdup("");
 }
 return newstr;
}

/*Read from a File and create a tree*/
struct Node * readATree(FILE * f)
{
 printf("ReadATree test");
      char c;
      char buffer[100];
      struct Node * newTree;
      c = fgetc(f);
      if (c == 'A'){
         fgets(buffer, 100, f);
         newTree = newNode(newStr(buffer));
  newTree -> 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)
{
 printf("WriteFile test");
 char buffer[100];
 strcpy(buffer, tree->value);
 if(tree != 0){
  if(tree->left == NULL && tree->right == NULL){
   fputc('A', f);
   fputs(buffer,f);
  } else{
   fputc('Q',f);
   fputs(buffer,f);
   writeAFile(tree->left, f);
   writeAFile(tree->right,f);
  }
 }
}

/*The play should start from here*/
int main (){
 printf("main test");
 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] == 'Y' || ans[0] == 'y')
   node = node->left;
  else if(ans[0] == 'N' || ans[0] == 'n')
   node = node->right;
  else
    printf("That is not a valid input.\n");
 }
  if(ans[0] == 'Y' || ans[0] == 'y')
   printf("I win!");
 else if(ans[0] == 'N' || ans[0] == 'n'){
   printf("What is your animal?\n");
   scanf("%s",ans);
   printf("Please enter a yes or no question that is true about %s?\n", ans);
   scanf("%s",q);
   node->right = newNode(q);
   node->right->left = newNode(ans);
   node->right->right = NULL;
  }
  writeAFile(root,f);
  fclose(f);
  return 0;
}

·H

#include<stdio.h>

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);

3 个答案:

答案 0 :(得分:3)

不要强迫SO的好人趟过并调试你的代码!另外,不要一直重复你的问题。之前没有得到满意的原因是人们不愿意弥补你的懒惰。

这就是调试器的用途。在调试器中运行您的代码,它会告诉您何时访问空指针。

如果您没有调试器,请将一堆打印语句放入您的程序中。如果您运行程序,崩溃前的最后一个打印输出将位于发生分段故障的位置上方。您可能希望在该点附近添加更多的打印语句,可能会抛出一些指针值。

答案 1 :(得分:3)

粗略地看一眼代码:

node->right = NULL;
node->right->right=NULL;

此处的第二行将访问NULL指针,这将导致段错误。

通常,在调试器中运行代码可以让您看到导致错误的行。

答案 2 :(得分:0)

我猜这些警告是一个线索:

animal.c: In function ‘main’:
animal.c:95: warning: format not a string literal and no format arguments
animal.c:96: warning: format not a string literal and no format arguments