减少实现此效果的代码?

时间:2012-08-10 12:17:07

标签: c string performance function substring

我正在研究一些字符串操作函数,这完全出于我自己的兴趣。但是,我可能希望在将来的代码中使用这些函数。我编写了以下内容来检查字符串中是否存在子字符串。我遇到了一个问题。我的程序比较两个字符串中的每个字符,但它有乱序字符的问题。这需要很长时间才能解释,所以我只举一个例子:

如果检查字符串“fooobar”中是否存在“oobar”,我的程序将无法找到子字符串的位置,因为它会在char“o”的第一个实例上绊倒 我开发了一个解决这个问题的工作,但这就是它的工作原理而不是一个真正的解决方案。所以我想知道是否有人可以告诉我他们将如何改进以下代码(请记住我不想使用任何其他库):

int chksbstr(char *str, char *sbstr)
{
    int i, sbstrlen, strlen, p = 0;

for(i = 0; sbstr[i] != '\0'; i++);
sbstrlen = i;
for(i = 0; str[i] != '\0'; i++);
strlen = i;
if(sbstrlen > strlen)
{
    printf("\n**Error substring is larger than base string!");
    return 2;
}
if(sbstrlen == strlen)
{
    if(str == sbstr) return 0;
    else return 1;
}
for(i = 0; i <= strlen; i++)
{
    if(str[i] == sbstr[p]) p++;
    else if(str[i] != str[i - 1]) p = 0;
    if(p == sbstrlen) return 0;
}
return 1;
}

2 个答案:

答案 0 :(得分:4)

少了23行:

if (strstr(baseString, subString) != NULL)
{
    /* contains */
}

答案 1 :(得分:1)

递归可以做得更好。哦,顺便说一句,描述性标识符更好。没有理由随机删除所有元音,也不要忘记const

int check_substring(const char* str, const char* to_go, const char* substr) {
    if (*to_go == '\0') return 1; // Hit all
    if (*str == '\0') return 0; // Ran out of string to check
    if (*str == *to_go) return check_substring(str + 1, to_go + 1, substr);
    else {
        if (*str == *substr)
            return check_substring(str + 1, substr + 1, substr);
        else
            return check_substring(str + 1, substr, substr);
    }
}
int does_contain_substring(const char* str, const char* sbstr) {
    return check_substring(str, sbstr, sbstr);
}