0

我有一个像(BST)这样的结构:

typedef struct node {
  char* name;  
  int age;
  struct node* left;       
  struct node* right;      
} node_t;

我必须创建一个函数,如:char* getSameAge(node_t* s, int age)返回一个字符串,如 name1:name2:....nameN 与具有 == age 的节点

我做了这个解决方案,它适用于测试,但使用 valgrind 它给了我错误......有人给我建议或替代/更好的解决方案吗?!

void visitTree(node_t* s,char buf[N],int age) {
  if(s!=NULL) {
    visitTree(s->left,buf,age);
    if(s->age == age) {
      if(strlen(buf) == 0) strcpy(buf,s->name);
      else{
       strcat(buf,s->name);
       if(s->left != NULL || s->right != NULL) strcat(buf,":");
      }
    }
    visitTree(s->right,buf,age);
  }
}

char* getSameAge(node_t* s, int age) {

  char buf[N];
  visitTree(r,buf,age);
  if(strlen(buf) == 0) {
    return NULL;
  }
  else {
    char *aux = malloc(strlen(buf));
    strcpy(aux,buf);
    return aux;
  }
}
4

1 回答 1

0

1.下面一行有错误(可能是其他的,但这绝对是其中之一):

char *aux = malloc(strlen(buf));

回想一下: strlen返回字符串长度,您缺少一个 NULL 终止符aux(因为strcpy将复制包括NULL 终止符在内的所有内容)。

它应该如下:

char *aux = malloc( sizeof( char ) * ( strlen( buf ) + 1 ) );

2.更改以下行:

char buf[N];

...如下:

char buf[N] = { 0 };

...通过不将数组中的每个元素初始化为 0(或 NULL 终止符 - '\0'),buf将采用前一个堆栈帧中的任意值。

旁白:我相信解决错误2真正需要做的就是确保 的第一个元素是 0。这适用于您仅使用并将NULL 终止符从源字符串复制到目标字符串。bufstrcpystrcat

于 2013-08-11T17:54:16.820 回答