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適切に複数の行に分割されていますか? これを行うための受け入れられた方法は何ですか?

EDIT:strlen()当然、文字列の長さを返すカスタム関数です。これは正常に動作します。

4

2 に答える 2

3

ループを一周するたびに、干し草の山から次のキャラクターを取得します。したがって、針と干し草の山の部分文字列を位置0から比較し終えるまでに、針に2文字がある場合、干し草の山のポインタは位置2を指しています(2文字の針の場合)。

これは、針と位置1から始まる干し草の山の部分文字列との比較をスキップすることを意味します。

于 2010-12-02T11:43:26.160 に答える
1

解決策は、標準的な無限ループで壁に頭をぶつけて、なぜあなたはプログラマーなのか不思議に思う方法です。

if(temp == *needle+nePos)

次のようにする必要があります。

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