2012-02-13 15 views
0

私はバイナリ検索機能を持っています。ポインタ文字配列、その配列の長さ、検索ポインタ文字配列、および別のカウンタを渡しています。文字配列の特定のメンバーに "strcmp"を使用する

int binarySearch(char* charArray, int len, char* searchItem, int counter) 
{ 
    int position; 
    int begin = 0; 
    int end = len-1; 
    int cond =0; 


    while(begin <= end) 
    { 

    position = (begin + end)/2; 

    // searchItem is a pointer array and the value I want to compare to is 
    // at the index of counter (determined outside of this function) 

    if((cond = strcmp(&charArray[position], &searchItem[counter])) == 0) 
    { 
     return position; 
    } 
    else if(cond < 0){ 
     begin = position + 1; 
    } 

    else 
     end = position - 1; 
    } 

return -1; 
} 

ここから、手でコードを調べると、それはうまくいくはずだと思うように思えますが、そうではありません。私は私のポインタのラインに沿ってどこかに投げ捨てられていると思います。私はそれらを参照しているので、間違ったデータが比較されています。

私はそれをあまりにも長い間見てきましたが、本当にここでいくつかの助けが必要です。

+0

「正常に動作しません」と定義する必要があります。助けを求めたり、他の人があなたが実際にどのような問題を抱えているかを推測させたりしないでください。 – tbert

答えて

2

何が何で検索されているかはあまり明確ではありません。しかし、私はあなたがソートされた文字配列内の文字を探していると推測しています。その場合は、strcmpを使用することはできません。代わりにあなたが行うことができます:

if(cond = (charArray[position] - *searchItem) == 0) 
+0

よく私はstrcmpは私がしたいものではないと思います...私がする必要があるのは、2つの単一の文字を比較し、アルファベット順に整理されている場合に最初に来る文字を決定することです。基本的に数字の代わりに1文字のバイナリ検索。文字をそれぞれのascii値にキャストせずにこれを行うことはできますか?編集:はいそれはありがとうことができます。 –

0

文字列は完全に同じ長さで比較されますか?あなたのコードはそう仮定しています。もしそうでなければ、strcmp()ではなくstrncmp()を使いたいでしょう。

0

strcmpは、char * までのすべての文字を末尾の '\ 0'文字と比較します。したがって、あなたは1文字を比較することはできません(基本的に2つの文字と末尾の '\ 0'が必要です)。文字列の一部を比較することはできません。比較。

わかりやすくするため、strcmpでは、ゼロで終了する文字列(最後の文字は '\ 0')が重要です。 strcmpは、2つの文字配列を開始から '\ 0'文字まで比較し、適切な比較値(< 0、= 0、> 0)を返します。もちろん、両方の文字配列は同じ長さでなければなりません。

1

strcmpは、比較対象の文字列がゼロで終了し、正確に等しい長さであることを前提としています。したがって、strlen(&charArray[position])strlen(&searchItem[counter])と等しくなければなりません。つまり、position == strlen(&charArray[0]) - strlen(&searchItem[counter])を意味します。あなたはまったく検索する必要はありません。接尾辞charArrayのいずれかが一致するか、一致しません。

しかし、それはおそらくあなたが意図したものではありません。あなたは何を達成しようとしていますか?

0

を、これらはASCII文字列で、アルファベット順にソートされなければならない場合、私はそれが

else if(cond < 0){ 
    end = position - 1; 
} 

else 
    begin = position + 1; 
} 

あるべきと考えている私は、あなたががそれらを並べ替えることを望むかどうか分かりませんか?

関連する問題