c - 改进 C ReplaceString 函数的建议?

标签 c string replace

我刚刚开始接触 C 编程,希望对我的 ReplaceString 函数提出批评。 它看起来非常快(除了一个 malloc 之外,它没有为结果字符串分配任何内存)但它看起来非常冗长,我知道它可以做得更好。

示例用法:

printf("New string: %s\n", ReplaceString("great", "ok", "have a g grea great day and have a great day great"));
printf("New string: %s\n", ReplaceString("great", "fantastic", "have a g grea great day and have a great day great"));

代码:

#ifndef uint
    #define uint unsigned int
 #endif

char *ReplaceString(char *needle, char *replace, char *haystack)
{
    char *newString;
    uint lNeedle = strlen(needle);
    uint lReplace = strlen(replace);
    uint lHaystack = strlen(haystack);
    uint i;
    uint j = 0;
    uint k = 0;
    uint lNew;
    char active = 0;
    uint start = 0;
    uint end = 0;

    /* Calculate new string size */    
    lNew = lHaystack;

    for (i = 0; i < lHaystack; i++)
    {

        if ( (!active) && (haystack[i] == needle[0]))
        {
            /* Start of needle found */
            active = 1;
            start = i;
            end = i;
        }
        else if ( (active) && (i-start == lNeedle) )
        {
            /* End of needle */
            active = 0;
            lNew += lReplace - lNeedle;
        }
        else if ( (active) && (i-start < lNeedle) && (haystack[i] == needle[i-start]) )
        {
            /* Next part of needle found */
            end++;
        }
        else if (active)
        {
            /* Didn't match the entire needle... */
            active = 0;
        }

    }
    active= 0;
    end = 0;


    /* Prepare new string */
    newString = malloc(sizeof(char) * lNew + 1);
    newString[sizeof(char) * lNew] = 0;

    /* Build new string */
    for (i = 0; i < lHaystack; i++)
    {

        if ( (!active) && (haystack[i] == needle[0]))
        {
            /* Start of needle found */
            active = 1;
            start = i;
            end = i;
        }
        else if ( (active) && (i-start == lNeedle) )
        {
            /* End of needle - apply replacement */
            active = 0;

            for (k = 0; k < lReplace; k++)
            {
                newString[j] = replace[k];
                j++;
            }
            newString[j] = haystack[i];
            j++;

        }
        else if ( (active) && (i-start < lNeedle) && (haystack[i] == needle[i-start])
                )
        {
            /* Next part of needle found */
            end++;
        }
        else if (active)
        {
            /* Didn't match the entire needle, so apply skipped chars */
            active = 0;

            for (k = start; k < end+2; k++)
            {
                newString[j] = haystack[k];
                j++;
            }

        }
        else if (!active)
        {
            /* No needle matched */
            newString[j] = haystack[i];
            j++;
        }

    }

    /* If still matching a needle... */
    if ( active && (i-start == lNeedle))
    {
        /* If full needle */
        for (k = 0; k < lReplace; k++)
        {
            newString[j] = replace[k];
            j++;
        }
        newString[j] = haystack[i];
        j++;
    }
    else if (active)
    {
        for (k = start; k < end+2; k++)
        {
            newString[j] = haystack[k];
            j++;
        }
    }

    return newString;
}

有什么想法吗?非常感谢!

最佳答案

不要调用 strlen(haystack)。您已经在检查字符串中的每个字符,因此计算字符串长度对您的循环来说是隐含的,如下所示:

for (i = 0; haystack[i] != '\0'; i++)
{
    ...
}
lHaystack = i;

关于c - 改进 C ReplaceString 函数的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3771882/

相关文章:

c++ - 要求编辑文本,文本格式

c - 如何使POSIX/Linux信号处理安全?

c - execve() 返回任何命令的错误

c++ - 检测 C++ 字符流中的字符

string - 如何将单词数组转换为按顺序包含单词字符的数组?

ruby - 如何使用 Ruby 的 gsub 函数替换字符串上过多的 '\n'

c - 项目中没有 Makefile.am 的 Makefile.in

c - 如何对我的字符指针数组进行排序

java - 如何使用包含空格的信用卡号?

regex - Visual Studio 2013 使用 REGEX 查找和替换无法正确替换