2015-11-21 25 views
-1

我正在尝试使用二进制搜索树按字母顺序排列一些单词。下面是代码的一部分:为什么我会在这方面发生分割错误?

int wordCmp (char a[], char b[]) 
{ 
int i = 0; 
while(a[i] == b[i]) 
    ++i; 
return a[i] < b[i]; 
} 
void Insert (node* &root , char a[]) 
{ 
if(root == NULL) 
    root = CreateNewNodde(a); 
else 
{ 
    if (wordCmp(a,root -> word)) 
     Insert(root -> left , a); 
    else Insert(root -> right, a); 
} 

}

我得到thise指令分段错误:

int wordCmp (char a[], char b[]) 
{ 
int i = 0; 
- > while(a[i] == b[i]) <- Segmentation Fault 
    ++i; 
return a[i] < b[i]; 
} 
+0

'while(a [i] && a [i] == b [i]) –

+0

谢谢,这似乎是问题所在。 – ivanciprian

+1

'char *'不是表示“单词”的好方法。使用'std :: string'。 –

回答

2

您索引数组边界之外。在C++中,数组不知道它的长度。请记住,字符数组通过在末尾具有字符'\ 0'来“终止”。该值将在布尔表达式中转换为false。

因此你必须做

int wordCmp (char a[], char b[]) 
{ 
    int i = 0; 
    while(a[i] && b[i] && a[i] == b[i]) 
     ++i; 
    return a[i] < b[i]; 
} 

注意,我检查A [1]和b [I]是有效的,即它们不包含 '\ 0'。此外,在C++中,表达式从左到右进行求值,因此如果[i]或b [i]包含'\ 0',那么 将不会评估[i] == b [i]。 您需要检查[i]和b [i],因为您不知道哪个字符数组包含最长的单词。

+1

实际上,您不必检查两个数组,因为如果其中一个在另一个之前命中“\ 0”,那么它们在这一点上不会相等。 –

+0

@BoPersson你是对的,同时检查[i]和b [i]是没有必要的。 – jensa

+0

这种方式和相同的性能更清晰 – Jerome