用C中的多个字符替换字符串中的一个字符

时间:2019-02-08 12:20:28

标签: c string replace

如果我有如下字符串: “龙珠很酷。”

但是我想将空格更改为多行:“ ---”

所以这将是最终结果:七龙珠-很酷-

我该怎么办?是否需要循环(我知道如何用另一个字符替换单个字符),或者有另一种方法吗?

2 个答案:

答案 0 :(得分:5)

有几种方法可以完成。一种方法是首先对字符串进行标记,例如使用strtok找出空格。

然后将不同的子字符串(单词)一一复制到新的字符串(字符数组)中,例如使用strcat。对于您复制的每个字符串,还复制一个字符串"---"

另一种选择是仅手动执行所有操作,而无需调用任何字符串库函数。

是的,您将需要循环。

答案 1 :(得分:1)

我制作了一个示例程序,您可以检查自己是否喜欢。替换子字符串时将遇到的最大问题是,您可能需要比原始源字符串更多的空间。因此,通常您希望将修改后的源字符串写入其他位置。您可以使用strncatstrncmp等有用的函数来解决目标缓冲区可能小于扩展源缓冲区的情况。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUF_LEN         32
#define MIN(p,q)            ((p) < (q) ? (p) : (q))


void replace (const char *src, char *buf, size_t buf_size, const char *pat, const char *rep) {
    size_t pat_len = strlen(pat), rep_len = strlen(rep);
    int inc, i = 0;
    const char *p = NULL;

    while (*src != '\0') {

        // Here, if we detect a match, we set our copy pointer and increment size.
        if (strncmp(src, pat, pat_len) == 0) {
            inc = MIN(buf_size - i - 1, rep_len);
            p = rep;
        } else {
            inc = MIN(buf_size - i - 1, 1);
            p = src;
        }

        // If we ran out of room in the buffer, we break out of the loop here.
        if (inc <= 0) break;

        // Here we append the chosen buffer with the increment size. Then increment our indexes.
        buf = strncat(buf, p, inc);
        i += inc;
        ++src;
    }

    // Don't forget the null-character.
    buf[i] = '\0';
}

int main (void) {
    const char *src = "Hello World!";
    const char *match = " ";
    const char *repl = "...";
    char buf[MAX_BUF_LEN] = {0};

    replace(src, buf, MAX_BUF_LEN, match, repl);

    fprintf(stdout, "The string \"%s\" has been transformed to \"%s\"\n", src, buf);
    return EXIT_SUCCESS;
}