Created
October 24, 2015 13:32
-
-
Save ecnelises/d98d7d5997cd1dc379ac to your computer and use it in GitHub Desktop.
C程序,把字符串source中出现的pattern替换成dest
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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