0

文字列配列のバイナリ検索を C で書きたいと思っています。

このコードを作成しましたが、エラーなしでコンパイルされますが、検索しようとすると結果が得られません。どんな助けでも大歓迎です。

文字列は型定義です。最初にこれを明確にしなかったことをお詫び申し上げます。

//Looks up word s, in dictionary.
bool lookup(string s)
{  
    int min = 0;
    int max = dictionary.size - 1;
    int mid;
    bool found = false;

    while (min <= max && !found)
    {
        mid = (min + max) /2;
        if (dictionary.words[mid].letters == s)
            found = true;
        else if (dictionary.words[mid].letters > s)
            max = mid -1;
        else
            min = mid + 1;
    }
    return found;
}
4

2 に答える 2

1

C の文字列は単なる char 配列であり、配列間の比較は開始アドレスのみを比較するため、配列の内容を比較するには librray 関数を==使用する必要があります。そのようです:strcmpstring.h

if (strcmp(dictionary.words[mid].letters, s) == 0)

編集

タグにも関わらず、cある種のstringタイプを持っていることがわかりました。これは C または C++ ですか?

于 2013-01-07T12:21:22.683 に答える
0

I think it would help if you pasted the string and the dictionary structures.

Assuming that the Dictionary is a sorted array of words.Strings (array of char) and string is a array of char as well then I would assume that when you do dictionary.words[int].letters the return type is a memory and same is the case with s. As the two strings are saved at different memory locations you are unable to find the string.

Try iterating through the string to compare the strings

bool lookup(string s)
{  
    int min = 0;
    int max = dictionary.size - 1;
    int mid;
    bool found = false;
    int i;
    int length = 0;                 //calculate the length of the input string
    while (s[length] != '\0')
    {
    length++;
    }

    while (min <= max && !found)
    {
        mid = (min + max) /2;
        for(i=0;i<length;i++)
        {
            if(dictionary.words[mid].letters[i] == '\0')
                break;
            if (dictionary.words[mid].letters[i] == s[i])
                continue;
            else if (dictionary.words[mid].letters[i] > s[i])
                max = mid -1;
            else
                min = mid + 1;
            break;
        }
        if(i==length)
            found=true;
    }
    return found;
}

I have not compiled the code but this should give you the gist.

于 2013-01-07T13:05:12.013 に答える