C: Помощь с пользовательской функцией strpos () - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть следующая функция:

int strpos(const char *needle, const char *haystack)
{
    int neLen, haLen, foundPos, nePos, i;
    char temp;

    neLen = strlen(needle);
    haLen = strlen(haystack);

    if(haLen < neLen)
        return -1;

    nePos    = 0;
    foundPos = -1;
    i        = 0;

    while((temp = *haystack++) != '\0'
          && (i < (haLen-neLen+1) || foundPos > -1)
          && nePos < neLen)
    {
        if(temp == *needle+nePos)
        {
            if(nePos == 0)
                foundPos = i;
            nePos++;
        }
        else
        {
            nePos = 0;
            foundPos = -1;
        }

        i++;
    }

    return foundPos;
}

Это работает правильно, когда я ищу один символ:

printf("Strpos: %d\n", strpos("a", "laoo")); // Result: "Strpos: 1"

Но это неправильно с длинной строкой:

printf("Strpos: %d\n", strpos("ao", "laoo")); // Result: "Strpos: -1"

В чем проблема?

Бонусный вопрос: правильно ли разбит цикл while на несколько строк?Какой приемлемый способ сделать это?

EDIT: strlen(), естественно, является пользовательской функцией, которая возвращает длину строки.Это работает правильно.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Каждый раз, когда вы идете по кругу, вы получаете следующего персонажа из стога сена.Таким образом, если у иглы есть два символа к тому времени, как вы закончили сравнение иглы с подстрокой стога сена, начинающейся в позиции 0, указатель стога сена будет указывать в позицию 2 (для иглы из двух символов).пропустить сравнение иглы с подстрокой стога сена, начиная с позиции 1.

1 голос
/ 02 декабря 2010

Решение имеет стандартное разнообразие "бей голову против стены в бесконечном цикле и удивляйся, почему черт возьми, ты программист".

if(temp == *needle+nePos)

Должно быть:

if(temp == *(needle+nePos))
...