Skip to content

Instantly share code, notes, and snippets.

@ecnelises
Created October 24, 2015 13:32
Show Gist options
  • Save ecnelises/d98d7d5997cd1dc379ac to your computer and use it in GitHub Desktop.
Save ecnelises/d98d7d5997cd1dc379ac to your computer and use it in GitHub Desktop.
C程序,把字符串source中出现的pattern替换成dest
#include <stdio.h>
#include <string.h>
const int max_length = 100;
int match_result[max_length];
char source[max_length * max_length];
char pattern[max_length];
char dest[max_length];
void find_str(char *src, char *ptrn, int mtb[]);
void replace_pattern(char *src, char *ptrn, char *dst, int mtb[]);
void subtract_newline(char str[]); // 去掉gets结果里的回车符
int main(void)
{
fgets(source, max_length, stdin);
fgets(pattern, max_length, stdin);
fgets(dest, max_length, stdin);
subtract_newline(source);
subtract_newline(pattern);
subtract_newline(dest);
match_result[0] = -1;
find_str(source, pattern, match_result);
replace_pattern(source, pattern, dest, match_result);
puts(source);
return 0;
}
void subtract_newline(char str[])
{
if (str[strlen(str) - 1] == '\n') {
str[strlen(str) - 1] = '\0';
}
}
void find_str(char *src, char *ptrn, int mtb[])
{
char *src_start = src;
int mtb_i = 0;
int ptrn_size = strlen(ptrn);
int ptrn_i = 0;
while (*src) {
if (*src == *ptrn) {
ptrn_i = 0;
while ((ptrn_i < ptrn_size) && (*src) && (*src++ = ptrn[ptrn_i++]));
if (ptrn_i == ptrn_size) { // 匹配成功
mtb[mtb_i++] = src - src_start - ptrn_i;
}
} else {
src++;
}
}
mtb[mtb_i] = -1; // 标志结束
}
void replace_pattern(char *src, char *ptrn, char *dst, int mtb[])
{
int src_size = strlen(src);
int ptrn_size = strlen(ptrn);
int dest_size = strlen(dst);
int offset = 0;
for (int i = 0; mtb[i] != -1; i++) {
if (ptrn_size < dest_size) { // 往后移
offset = dest_size - ptrn_size;
for (int j = src_size; j >= mtb[i]; j--) {
src[j + offset] = src[j];
}
for (int j = i + 1; mtb[j] != -1; ++j) {
mtb[j] += offset;
}
src_size += offset;
} else if (ptrn_size > dest_size) { // 向前缩
offset = ptrn_size - dest_size;
for (int j = mtb[i] - offset; j <= src_size; j++) {
// 有等号是为了包含最后的0
src[j] = src[j + offset];
}
for (int j = i + 1; mtb[j] != -1; ++j) {
mtb[j] -= offset;
}
src_size -= offset;
}
for (int j = 0; j < dest_size; ++j) {
src[mtb[i] + j] = dest[j];
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment