Использование "strcmp" для определенных членов массива символов в c - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть функция бинарного поиска. Я передаю массив символов указателя, длину этого массива, массив символов указателя поиска и другой счетчик для чего-то еще.

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;
}

Отсюда, просмотр кода вручную заставляет меня думать, что он должен работать нормально, однако это не так. Я думаю, что меня сбивают с толку где-то в русле моих указателей и того, как я на них ссылаюсь, чтобы сравнивать неверные данные.

Я смотрел на это слишком долго ... мне здесь нужна помощь.

Ответы [ 5 ]

2 голосов
/ 13 февраля 2012

Не очень понятно, что ищется в чем. Но я предполагаю, что вы ищете символ в отсортированном массиве символов. Если это так, вы не можете использовать strcmp. Вместо этого вы можете сделать:

if(cond = (charArray[position] - *searchItem) == 0)
1 голос
/ 13 февраля 2012

strcmp предполагает, что сравниваемые строки заканчиваются нулем и имеют точно одинаковую длину Следовательно, strlen(&charArray[position]) должно равняться strlen(&searchItem[counter]). Это значит position == strlen(&charArray[0]) - strlen(&searchItem[counter]). Вам не нужно искать вообще. Либо суффикс charArray соответствует, либо нет.

Но это, вероятно, не то, что вы хотели. Чего ты пытаешься достичь?

0 голосов
/ 13 февраля 2012

Если это строки ASCII и должны быть отсортированы в алфавитном порядке, я считаю, что это должно быть

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

else
    begin = position + 1;
}

Я не уверен, как вы хотите их отсортировать?

0 голосов
/ 13 февраля 2012

strcmp сравнивает все символы в символе * до завершающий символ '\ 0'.Таким образом, вы не можете сравнивать отдельные символы (в основном вам всегда нужны два, символ и завершающий '\ 0'), и вы не можете сравнивать части строки, если вы не вставите '\ 0' в место, до которого вы хотите выполнитьсравнение.

Просто для ясности, строки с нулем в конце (последний символ '\ 0') важны для strcmp.strcmp сравнивает два массива символов от начала до символа '\ 0' и возвращает соответствующее значение сравнения (<0, = 0,> 0).И, конечно, оба символьных массива должны быть одинаковой длины.

0 голосов
/ 13 февраля 2012

Строки для сравнения имеют одинаковую длину?Ваш код предполагает это.Если нет, вы захотите использовать strncmp (), а не strcmp ().

...