程序代码:
typedef struct BiTNode

char *data; 
struct BiTNode *lchild,*rchild; 
} BiTNode, *BiTree; 
CString sentence="dj-ZW 他们/rN [ [ vp-ZZ 都/d [ [ vp-ZZ 会/vM [ [ vp-ZZ 尽力/d [ [ vp-PO 收集/v [ [ np-DZ 有关/b 信息/n ";int CreateBiTree(BiTree *Tree, CString &str) 

CString word=str.SpanExcluding(" ");
str=str.Mid(word.GetLength());
str.TrimLeft();
if(word=="[" || word.IsEmpty()) {
(*Tree) = NULL;
return(0);
}
else {
if(!((*Tree) = (BiTree)malloc(sizeof(BiTNode)))) 
exit(0);
(*Tree)->data = (char*)(LPCTSTR)word; 
List.AddTail((*Tree)->data);
CreateBiTree(&((*Tree)->lchild), sentence); 
CreateBiTree(&((*Tree)->rchild), sentence); 
}
return(1);
}
int Visit(char *str) 

    if (str)
    {        
CString msg;
msg.Format("%s", str);
AfxMessageBox(str);
return(1); 
    }
else
return(0);

} int PreOrderTraverse(BiTNode *T, int(*Fun) (char *str)) 

if(T) 

if(Visit(T->data)) 
if(PreOrderTraverse(T->lchild,Fun)) 
if(PreOrderTraverse(T->rchild,Fun)) 
return(1); 
return(0); 

else 
return(1); 
} void CPreOrderDlg::OnButton1() 
{
BiTree Tr=NULL;
int i=CreateBiTree(&Tr, sentence);
if(i==1)
AfxMessageBox("OoooK");
else
AfxMessageBox("ErrRR");
PreOrderTraverse(Tr,Visit);
}输出结果:不是预期的CString sentence中以空格隔开的字符串,而是乱码。请帮忙指正错误。非常感谢!

解决方案 »

  1.   

    是不是string类型有多个,如ustring...
      

  2.   

    要注意的是:
    (*Tree)->data = (char*)(LPCTSTR)word;
    这里data指向一个临时变量,那么就得看你的List.AddTail里面是否另外申请了内存来保存这个字符串,否则就是一个野指针,当然是乱码了。
      

  3.   

    回复二楼:
    这里的List.AddTail是CStringList类型,目的是把(*Tree)->data的内容保存起来,以便察看里面到底是什么。
    经实验,List.AddTail显示的内容是预期的。就是说,(*Tree)->data的内容也是预期的。
      

  4.   

    如果你这个List是CStringList类型,那么这个(*Tree)->data = (char*)(LPCTSTR)强制就有点匪夷所思了,直接List.AddTail(word)不就行了?而且如果是为了查看,除了调试中断来看,经过你的类型强制也已经改变了原意(如果是UNICODE编码,就是错误;如果不是UNICODE编码,就是多余)。再说,既然data指向临时指针,就算你用List保存一个值来查看,和data本身还是没有关系,还是个野指针,最终就是出错。
      

  5.   

    谢谢Mackz。我明白了自己的错误所在。
    (*Tree)->data = (char*)(LPCTSTR)word; 
    临时指针,函数执行完后就被销毁。
    怎么改呢?
      

  6.   

    已经解决。感谢Mackz。
    结帖。