Я сделал пример программы, которую вы можете изучить, если хотите.Самая большая проблема, с которой вы столкнетесь при замене подстрок, заключается в том, что вам может понадобиться больше места, чем в исходной строке.Поэтому обычно вы хотите написать измененную исходную строку в другом месте.Вы можете использовать полезные функции, такие как strncat
и strncmp
, чтобы обойти ситуации, когда у вас есть целевой буфер, который может быть меньше, чем расширенный источник.
#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;
}