-2

これは私の呼びかけです:

testFunc(0,0,"+++++A+++b+c++++d+e++++f+g+++++h+i","Abcdefghi");

関数に:

void testFunc(int isRight, int step, const char* str1, const char* str2)
{
    static int testNum = 1;
    printf("test%d: %d\n", testNum++, extendedSubStr(isRight, step, str1, str2));
}

それは呼び出します:

    int extendedSubStr(int isRight, int gap, const char* str1, const char* str2)
{
// find location of the first char
        char * pch;
        char * firstOcur;
        pch=strchr(str1,str2[0]);
        firstOcur = pch;
        int i=0;
        while (pch!=NULL)
        {
            i++;
            // find next char from the remaining string
            pch=strchr(pch+1,str2[i]);
        }

    if(i==strlen(str2))
    {
                    // return position of the first char
        return firstOcur-str1;
    }
}

私の問題は、ヌルで終了する文字列を期待するstr1 使用を反復しようとしたときに始まります。strchr()なぜかループし続けます。を使用しないことをお勧めしますmemchr()

null が終了していないstr1のはなぜですか? str2どうすればそれらを終了できますか?

4

3 に答える 3

6

2 つの文字列は間違いなく null で終了します。何が起こるかというと、コードが null ターミネータを超えて繰り返されます。

str2[i]に達したら反復を停止する必要があります\0:

    int i = 1;
    while (pch != NULL && str2[i] != 0)
    {
        pch = strchr(pch + 1, str2[i++]);
    }

マンページからstrchr

終端のヌル文字は文字列の一部と見なされます。したがって、c が\0の場合、関数は終端の位置を特定します\0

基本的には、 のヌル文字に到達すると、 のヌル文字str2と一致しますstr1str2この後、ループは、メモリ内の の末尾を超えて表示される文字を探しますstr1。カオスが起こります。

于 2012-11-27T14:53:38.620 に答える
0

他の人がすでに述べたように、Cスタイルの文字列は「\0」で終了します。

あなたは見たいかもしれませんstrstr(s1, s2)。strstrは、s1内のs2の位置を探します。パラメータisRightgapは使用されないため、これにより簡略化されますextendedSubStr

int extendedSubStr(int isRight, int gap, const char* str1, const char* str2)
{
    char *r = strstr(str1, str2);
    return r != NULL ? r - str1 : -1;
}
于 2012-11-27T15:00:49.343 に答える
0

使用する

while (pch!=NULL && *(pch+1)!='\0' && str2[i]!='\0')

それ以外の

while (pch!=NULL)
于 2012-11-27T14:56:46.593 に答える