0

我有以下功能:

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正确分成多行?什么是公认的方式来做到这一点?

编辑:strlen()自然是一个返回字符串长度的自定义函数。这工作正常。

4

2 回答 2

3

每次循环时,您都会从 haystack 中获得下一个字符。因此,如果在您完成将 needle 与从位置 0 开始的 haystack 的子字符串进行比较时,needle 有两个字符,则 haystack 指针指向位置 2(对于两个字符的 needle)。

这意味着您跳过从位置 1 开始将 needle 与 haystack 的子串进行比较。

于 2010-12-02T11:43:26.160 回答
1

解决方案是标准的在无限循环中撞墙并想知道为什么你是程序员的品种。

if(temp == *needle+nePos)

应该:

if(temp == *(needle+nePos))
于 2010-12-02T12:23:38.170 回答