字符串搜索C程序,不使用内置函数

时间:2014-04-14 09:51:53

标签: c

我的C程序有问题。这是String Search程序。问题是当我键入字符串aabaaacaamaad时,当我在其中搜索NULL时结果为ab,但ab中的结果不应该aabaaacaamaad }。 amad也是如此,这是正确的,但为什么会出现aabaaacaamaad?代码:

char* MyStrstr(char* pszSearchString, char* pszSearchWord);
int main(int argc, char* argv[])
{
    char szTemp1[20] = {0};
    char szTemp2[10] = {0};
    char * pszTemp1 = NULL;
    strcpy(szTemp1, "aabaaacaamaad");
    strcpy(szTemp2, "aa");

    pszTemp1 = MyStrstr(szTemp1, szTemp2);
    printf("%s", pszTemp1);
    getch();
    return 0;
}

char* MyStrstr(char* pszSearchString, char* pszSearchWord) 
{
    int nFcount = 0;                    
    int nScount = 0;                    
    int nSearchLen = 0;
    int nIndex = 0;
    char* pszDelString = NULL; 

    if(pszSearchString == NULL || pszSearchWord == NULL) {
    return NULL;
    }   

    while(pszSearchWord[nSearchLen] != '\0') {
        nSearchLen++;
    }                       
    if(nSearchLen <= 0){
        return pszSearchString;
    }

    for(nFcount = 0; pszSearchString[nFcount] != '\0'; nFcount++) {
        if(pszSearchString[nFcount] == pszSearchWord[nScount]) {
           nScount++;
        } else {
           nScount = 0;
        }  

        if(nScount == nSearchLen) {
            nIndex = (nFcount - nScount) + 1;
            pszDelString = pszSearchString + nIndex;
            return pszDelString;
        }
   }
   return NULL;
}

1 个答案:

答案 0 :(得分:1)

我看到你的代码试图做什么,你想避免循环中的循环,但是你却错过了一件事。当比赛失败时,你不会回去,但仍然会在pszSearchString中向前移动,而你却不应该。这个缺陷的结果是,如果匹配不完整,则跳过字符。这就是strstr函数最初在循环中使用循环的原因,因此pszSearchString中的每个字符都有一个与pszSearchWord匹配的新循环。这里是来自BSD / Darwin的原始strstr.c文件:

char * strstr(const char *in, const char *str)
{
    char c;
    size_t len;

    c = *str++;
    if (!c)
        return (char *) in; // Trivial empty string case

    len = strlen(str);
    do {
        char sc;

        do {
            sc = *in++;
            if (!sc)
                return (char *) 0;
        } while (sc != c);
    } while (strncmp(in, str, len) != 0);

    return (char *) (in - 1);
}