-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 using strchr()which 需要一个空终止的字符串时,我的问题就开始了。由于某种原因,它一直在循环。我宁愿不使用memchr().

为什么str1并且str2没有被归零终止?我怎样才能终止它们?

4

3 回答 3

6

这两个字符串肯定是空终止的。发生的情况是您的代码遍历空终止符。

您需要在str2[i]达到时停止迭代\0

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

strchr手册页:

终止空字符被认为是字符串的一部分;因此,如果 c 是\0,函数定位终止\0

基本上,发生的情况是,一旦到达 中的空字符str2,就会匹配 中的空字符str1。在此之后,您的循环继续查找出现str2在内存末尾之后的字符str1。混乱随之而来。

于 2012-11-27T14:53:38.620 回答
0

采用

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

代替

while (pch!=NULL)
于 2012-11-27T14:56:46.593 回答
0

正如其他人已经提到的,C 风格的字符串以 '\0' 结尾。

你可能想看看strstr(s1, s2). strstr 查找 s2 在 s1 中的位置。由于参数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 回答