|
|
#2
星泪成寒2019-05-14 10:07
我的想法是:
1.先把文件全部内容读到内存里 2.在内存里搜索目标字符串(BF/KMP/AC/BM 算法), 搜到了就把 内存开始 到 目标字符串 写到文件里, 再写替换字符串, 继续搜素 3.最后把结尾字符串写入,完成替换 程序代码:#include <stdio.h> #include <string.h> #include <memory.h> #include <malloc.h> const char* TARGET_FILE = "C:\\Users\\Lubin\\Desktop\\test.txt"; const char* target_string_val = "hello"; const char* replace_string_val = "how are you"; int main(void) { FILE* fp = NULL; long i, size = 0L; char* mem, *tmp; size_t target_string_len; size_t replace_string_len; target_string_len = strlen(target_string_val); replace_string_len = strlen(replace_string_val); /* 打开文件 */ fp = fopen(TARGET_FILE, "rb"); if (NULL == fp) { perror("fopen failed"); goto END; } /* 获取文件大小 */ fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); printf("=== File size is %ld bytes\n", size); if (size < target_string_len) { printf("no match\n"); goto END; } /* 读取全部文件到内存 */ mem = (char*)calloc(size, 1); if (NULL == mem) { perror("calloc failed"); goto END; } fread(mem, 1, size, fp); tmp = mem; /* 重开文件用于写 */ fclose(fp); fp = fopen(TARGET_FILE, "wb"); /* 字符串搜索 */ for (i = 0L; i <= size - target_string_len; ++i) { if (memcmp(mem + i, target_string_val, target_string_len) == 0) { printf("== find match at offset %ld\n", i); /* 写入开始到目标字符串的内容 */ if (mem + i - tmp) { printf("== write %ld bytes header\n", mem + i - tmp); fwrite(tmp, 1, mem + i - tmp, fp); } /* 写入替换字符串 */ printf("== write replace string\n"); fwrite(replace_string_val, 1, replace_string_len, fp); tmp = mem + i + target_string_len; printf("== update tmp = %s\n", tmp); i += target_string_len - 1; } } /* 写入尾部(结尾不是目标字符串的情况) */ if (tmp < (mem + size)) { printf("== write tail %ld bytes\n", mem + size - tmp); fwrite(tmp, 1, mem + size - tmp, fp); } printf("=== Replace END\n"); fclose(fp); free(mem); //pause END: getchar(); return 0; } |
串的查找和替换
【问题描述】:打开一篇英文文章(TXT文件),在该文章中找出所有给定的单词,然后对所有给定的单词替换为另外一个单词,再存盘。
我的思路是,打开文件然后进行给定字符串与文件中进行对比,如果符合就进行修改,然后再保存到文档中。可是这只出现在屏幕上,原文档没有修改,怎么做啊。
#include "string.h"
#include "stdio.h"
void str_replace(char * cp, int n, char * str)
{
int lenofstr;
int i;
char * tmp;
lenofstr = strlen(str);
//str3比str2短,往前移动
if(lenofstr < n)
{
tmp = cp+n;
while(*tmp)
{
*(tmp-(n-lenofstr)) = *tmp; //n-lenofstr是移动的距离
tmp++;
}
*(tmp-(n-lenofstr)) = *tmp; //move '\0'
}
else
//str3比str2长,往后移动
if(lenofstr > n)
{
tmp = cp;
while(*tmp) tmp++;
while(tmp>=cp+n)
{
*(tmp+(lenofstr-n)) = *tmp;
tmp--;
}
}
strncpy(cp,str,lenofstr);
}
int main()
{
char str1[1024];
char str2[100],str3[100];
int i,len,count=0;
char c;
char *p;
printf("\n请输入要查找的字符串和用于替换的字符串(中间用空格隔开): ");
scanf("%s",str2);
scanf("%s",str3);
//read string from news.txt
FILE *file=freopen("test2.txt","r",stdin);
i=0;
c = getchar();
while(c!=EOF)
{
str1[i] = c;
i++;
c = getchar();
}
str1[i] = '\0';
//开始查找字符串str2
p = strstr(str1,str2);
while(p)
{
count++;
//每找到一个str2,就用str3来替换
str_replace(p,strlen(str2),str3);
p = p+strlen(str3);
p = strstr(p,str2);
}
printf("\ncount = %d\n",count);
printf("Result = %s\n",str1);
fprintf(file,"%s",str1);
fclose(file);
}
程序代码: