C中strstr的实现方法

做题目的时候需要自己实现strstr函数

/************************************************************************/
/* 编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0。 /* /************************************************************************/

#include <stdio.h>
#include <assert.h>

const char * IND(const char * str, const char * substr)
{
    assert(substr != NULL && str != NULL);
    const char * psub = substr;
    const char * pstr = str;

    while (*pstr)
    {
// if (*pstr != *psub)
// continue;

        const char * tmp = pstr;
        while (*tmp++ == *psub++);

        if (*psub == '\0')
            return pstr;

        psub = substr;
        pstr++;
    }

    return NULL;
}

int main()
{
    //char * substr = "hello";
    char * substr = "";
    char * str = "skljdfhellosjdlf";

    const char * res = IND(str, substr);
    if (res != NULL)
        printf("%s\n", res);
    else
        printf("not find\n");

    res = strstr(str, substr);
    if (res != NULL)
        printf("%s\n", res);
    else
        printf("not find\n");

    return 0;
}

这是微软提供的库函数版本

/***
*strstr.c - search for one string inside another
* * Copyright (c) Microsoft Corporation. All rights reserved.
* *Purpose:
* defines strstr() - search for one string inside another
* *******************************************************************************/

#include <cruntime.h>
#include <string.h>

/***
*char *strstr(string1, string2) - search for string2 in string1
* *Purpose:
* finds the first occurrence of string2 in string1
* *Entry:
* char *string1 - string to search in
* char *string2 - string to search for
* *Exit:
* returns a pointer to the first occurrence of string2 in
* string1, or NULL if string2 does not occur in string1
* *Uses:
* *Exceptions:
* *******************************************************************************/

char * __cdecl strstr (
 const char * str1,
 const char * str2
 )
{
 char *cp = (char *) str1;
 char *s1, *s2;

 if ( !*str2 )
 return((char *)str1);

 while (*cp)
 {
 s1 = cp;
 s2 = (char *) str2;

 while ( *s1 && *s2 && !(*s1-*s2) )
 s1++, s2++;

 if (!*s2)
 return(cp);

 cp++;
 }

 return(NULL);

}

得到的效果是一致的, 不过, 我们这里没有使用强制类型转化将const char * 转化为 char *类型,(其实从这点上来看, C中的const只是一个纸老虎, 一个强制类型转换就没了<-_->!!)
库函数代码中

 if ( !*str2 )
            return((char *)str1);

感觉似乎没有这段也是可以输出预期的结果的。

你可能感兴趣的:(c)