2010-07-29 88 views
0

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

我.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<length; i++) 
     newStr += charBuffer[i]; 
} 
return (newStr + "\0"); 
} 

/*Read from a File and create a tree*/ 
struct Node * readATree(FILE * f) 
{ 
    char c; 
    char buffer[100]; 
    struct Node * newTree; 
    c = fgetc(f); 
    if (c == 'A'){ 
    fgets(buffer, 100, f); 
    newTree = newNode(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) 
{ 
    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); 
+3

的一般性意见:因为几乎所有的功能,有*事*与他们错了,这是令人惊讶的是,你起身这个代码量注意到的东西是前错了,并试图解决它。我会建议您在编写代码时更频繁地编译,测试和调试代码,这样该过程更易于管理。 – 2010-07-29 20:57:07

+0

我认为你的.c文件开头的一部分没有被格式化为'code' – nategoose 2010-07-30 17:44:57

回答

0

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

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

不要忘记在完成使用后释放分配的内存。

1
char * newStr (char * charBuffer) 
{ 
    int i; 
    int length = strlen(charBuffer); 
    char newStr; 
    if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){ 
    for(i=1; i<length; i++) 
     newStr += charBuffer[i]; 
    } 
    return (newStr + "\0"); 
} 

嗯,这里有一些有趣的东西......要获得单刀直入,你要一个字符指针的内容复制到另一个和这个功能是不会做的。你真正要做的就是将charBuffer中每个char的值合并到newStr中,因为char只是一个8位整数,然后通过隐式转换将该整数作为指针返回,因此现在将其视为内存地址。

如前所述,您应该使用strdup(),因为这正是函数应该做的。没有必要重新发明轮子。 :)

3

可能有几个,但这里有什么地方不对劲几点:

  1. 你的函数中newstr只是非常, 非常错误的。在猜测你想要 类似:

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

    做,而不是(同样为类似的代码 :

    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. 像你这样在这里你可以不投一个字符串为char 其他地方也行)

    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 
    }