我有一个类似(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;
}
}
答案 0 :(得分:0)
1。以下行有错误(可能是其他人,但这肯定是其中之一):
char *aux = malloc(strlen(buf));
召回: strlen
返回字符串长度,缺少aux
的NULL终止符(因为strcpy
将复制所有内容> em> NULL终结符。)
应该如下:
char *aux = malloc( sizeof( char ) * ( strlen( buf ) + 1 ) );
2. 更改以下行:
char buf[N];
......如下:
char buf[N] = { 0 };
...通过不将数组中的每个元素初始化为0(或NULL终结符 - '\ 0'),buf
将从前一个堆栈帧中获取任意值。
旁白:我相信你真正所有必须做的就是解决 2 错误,确保{{1}的第一个元素这只 是有效的,因为你只使用buf
和strcpy
将NULL终止符从源字符串复制到目标字符串。