【问题标题】:Find a replace a substring C查找替换子串 C
【发布时间】:2015-07-30 22:33:14
【问题描述】:

我正在尝试查找替换,但不仅适用于字符串,还适用于子字符串。所以我正在处理的程序会查找单词“bar”并在“bar”的任何实例前面附加“foo”。所以我的方法是,我没有实际附加字符串,而是用“foobar”替换整个字符串“bar”。我现在拥有的代码(未完全测试)应该找到所有出现的“bar”并将其替换为“foobar”。但是,如果有一个看起来像“bar123abc”的字符串,它不会用“foobar123abc”替换它。

这是我的代码:

static void replaceAllString(char *buf, const char *orig, const char *replace)
{
    int olen, rlen;
    char *s, *d;
    char *tmpbuf;

    if (!buf || !*buf || !orig || !*orig || !replace)
        return;

    tmpbuf = malloc(strlen(buf) + 1);
    if (tmpbuf == NULL)
        return;


    olen = strlen(orig);
    rlen = strlen(replace);

    s = buf;
    d = tmpbuf;

    while (*s) {
        if (strncmp(s, orig, olen) == 0) {
            strcpy(d, replace);
            s += olen;
            d += rlen;
        }
        else
            *d++ = *s++;
    }

    *d = '\0';

    strcpy(buf, tmpbuf);
    free(tmpbuf);
}

【问题讨论】:

  • 那么在不工作的情况下它会做什么呢?您是否真的尝试在调试器中或使用 printfs 对其进行调试?这看起来不对:tmpbuf = malloc(strlen(buf) + 1);tmpbuf 结果对吗?结果不需要比输入 buf 长吗?
  • 你意识到这个功能是一个即时的安全噩梦,对吧?我想知道你为什么选择 C ​​来做它最不适合的工作之一。
  • @LeeDanielCrocker:我认为在 C 中实现这一点通常没有什么问题。但我同意给定函数的噩梦。

标签: c string replace find


【解决方案1】:

我可以这样做:

static char *replaceAll(char *buf, int buflen, const char *orig, const char *replace) {
    if (!buf || !*buf || !orig || !*orig || !replace) return buf;

    int olen = strlen(orig), rlen = strlen(replace);

    int max = strlen(buf) + 1;
    if (olen < rlen) {
        max = rlen * ((max / olen) + 1) + 1;
    }
    char *tmpbuf = malloc(max);
    char *bp = buf, *tp = tmpbuf, *sp;

    while (NULL != (sp = strstr(bp, orig))) {
        int f = sp - bp;
        memmove(tp, bp, f);
        memmove(tp + f, replace, rlen);
        tp += f + rlen;
        bp += f + olen;  // no recursive replacement
    }
    strcpy(tp, bp);
    strncpy(buf, tmpbuf, buflen);
    free(tmpbuf);
    return buf;
}

char haystack[128] = "123bar456bar7ba8ar9bar0";

int main(int ac, char *av[]) {
    printf("%s\n", replaceAll(haystack, sizeof haystack, "bar", "foobar"));
}

注意:传递buflen 不是可选的!不要写入不知道长度的内存缓冲区。如果我正在面试 C 程序员,这将是一个即时的“不雇用”。 tmpbuf 分配了长度max,粗略地计算了最坏的情况(类似于“barbarbar”)。这里的繁重工作由strstr() 完成。

【讨论】:

  • ...当然,如果我只是被赋予在字符串中查找和替换子字符串的任务,我只会在一行 Python 中完成。
猜你喜欢
  • 2011-10-13
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多