我的C程序有问题。这是String Search程序。问题是当我键入字符串aabaaacaamaad
时,当我在其中搜索NULL
时结果为ab
,但ab
中的结果不应该aabaaacaamaad
}。 am
和ad
也是如此,这是正确的,但为什么会出现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;
}
答案 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);
}