请帮忙用C语言写一个程序!急!!

文件中字符串的查找和替换:程序运行时,提示用户输入文本文件的名字,打开用户输入的文件。然后提示用户输入待查找字符串(可以包含空格)和替换字符串(可以包含空格)。程序需要把... 文件中字符串的查找和替换:
程序运行时,提示用户输入文本文件的名字,打开用户输入的文件。然后提示用户输入待查找字符串(可以包含空格)和替换字符串(可以包含空格)。程序需要把文件中所有的含有待查找字符串的地方全部用替换字符串替换,把所有内容全部重新写回原文件。字符比较时区分大小写。
展开
 我来答
希声和寡
2009-03-17 · TA获得超过2.6万个赞
知道大有可为答主
回答量:6437
采纳率:0%
帮助的人:3508万
展开全部
晚上回去看看吧

=========================
给,已经在VC6.0上编译运行确认:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 100 //暂定文件最大长度为100个char型

char * replace(char *str, char *str1, char *str2, char *strretu)
{
char *str_temp = str;
char *str1_temp = str1;
char *str2_temp = str2;
char *strretu_temp = NULL;

unsigned long char_size = (unsigned long)sizeof(char);
/*计算字符长度*/
unsigned long i,rep_acc = 0;
unsigned long str_len = strlen(str);
unsigned long str1_len = strlen(str1);
unsigned long str2_len = strlen(str2);

/*首先找出Str里有几个地方要被替换的*/
for(; str_temp - str < str_len; )
{
for(i = 0; i < str1_len; i++)
{
if(*str_temp++ != *str1_temp++)
{
str1_temp = str1;
break;
}
else
{
if(i == str1_len - 1)
{
str1_temp = str1;
rep_acc++;
}
}
}
}
str1_temp = str1;
str_temp = str;

/*分配所需内存*/
strretu = strretu_temp = (char *)malloc(((str_len - str1_len * rep_acc) + str2_len * rep_acc + 1) * char_size);
/*替换*/
for(; str_temp - str < str_len; )
{

for(i = 0; i < str1_len; i++)
{
*strretu_temp++ = *str_temp;

if(*str_temp++ != *str1_temp++)
{
str1_temp = str1;
break;
}
else
{

if(i == str1_len - 1)
{
strretu_temp = strretu_temp - str1_len;

for(i = 0; i < str2_len; i++)
{
*strretu_temp++ = *str2_temp++;
}
str2_temp = str2;
str1_temp = str1;
}
}
}
}
*strretu_temp = '\0';
str1_temp = str1;
str_temp = str;
str2_temp = str2;

return(strretu);
}

int main(void)
{
char str[N] = {NULL};
char str1[N] = {NULL};
char str2[N] = {NULL};
char *strretu = NULL;

char ch;
int i=0;
char fliename[20]={NULL};
FILE *p;

printf("\n请输入文件名: \n");
gets(fliename);

if((p=fopen(fliename,"r"))==NULL)
{
printf("\n打开文件失败\n");
getch();

return 0;
}

while((ch=fgetc(p))!=EOF)
{
str[i++]=ch;
}
fclose(p);

printf("\n请输入待查找字符串: \n");
gets(str1);
printf("\n请输入替换字符串: \n");
gets(str2);

strretu = replace(str, str1, str2, strretu);

p=fopen(fliename,"w+");
fputs(strretu, p);
fclose(p);

free(strretu);

printf("替换完成!\n任意键关闭!\n");
getch();
return 0;
}

运行结果:

请输入文件名:
1234.txt

请输入待查找字符串:
1*1

请输入替换字符串:
45 45
替换完成!
任意键关闭!

注意:输入的文件名要带后缀
kwl5209876
2009-03-17 · 超过12用户采纳过TA的回答
知道答主
回答量:249
采纳率:0%
帮助的人:70.9万
展开全部
去图书馆借本书,这类似的程序多了去了,小改就OK了。重新写一个太麻烦了。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
solo俊
2009-03-17
知道答主
回答量:16
采纳率:0%
帮助的人:0
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Seeker2013

2009-03-17 · 帮助被人提升自己,加油!
Seeker2013
采纳数:1207 获赞数:1198

向TA提问 私信TA
展开全部
main()
{
print("");
………………

}

^_^
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sherry2love
2009-03-17
知道答主
回答量:13
采纳率:0%
帮助的人:4.7万
展开全部
好像要用一个QB的系统吧 我们正在学
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b9c8b3191
2009-03-17 · TA获得超过5200个赞
知道大有可为答主
回答量:3683
采纳率:0%
帮助的人:3856万
展开全部
先留个名,我试试看

差不多可以了,要写回原文件还真不厚道- -,否则可以简单很多很多很多的- -~
已知BUG:每次替换后文件末尾会增加一个回车,懒得改了- -
强烈要求加到最高250分- -bb...写那么多真累- -

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

#define MAXLEN 80

struct buf
{
char c;
struct buf *next;
};

void main()
{
FILE *fp;
char t,file_name[MAXLEN],find_s[MAXLEN],replace_s[MAXLEN];
int flag=0,i,count;
struct buf *head,*node;

while(flag==0)
{
printf("请输入源文件名:\n");
i=0;
while((t=getchar())!='\n')
{
file_name[i]=t;
i++;
}
file_name[i]='\0';

if((fp=fopen(file_name,"r"))==NULL)
{
printf("打开文件失败\n");
continue;
}
flag=1;
}

flag=0;
while(flag==0)
{
printf("\n请输入待查找字符串\n");
i=0;
while((t=getchar())!='\n')
{
find_s[i]=t;
i++;
}
find_s[i]='\0';

if(i==0)
{
printf("未输入任何字符");
continue;
}
flag=1;
}

flag=0;
while(flag==0)
{
printf("\n请输入待替换字符串\n");
i=0;
while((t=getchar())!='\n')
{
replace_s[i]=t;
i++;
}
replace_s[i]='\0';

if(i==0)
{
printf("未输入任何字符");
continue;
}
flag=1;
}

head=node=(struct buf *)malloc(sizeof(struct buf));
flag=1;
while(feof(fp)==0)
{
count=0;
fread(&t,1,1,fp);
while(t==find_s[count])
{ //开始匹配
count++;
if(feof(fp)==1)
{
if(count==(int)strlen(find_s))
{ //到文件末尾且恰好匹配时
count=strlen(replace_s);
i=0;
while(i<count)
{
node->c=replace_s[i];
node->next=(struct buf *)malloc(sizeof(struct buf));
node=node->next;
i++;
}
}
else
{ //到文件未但不匹配时
i=0;
while(i<count)
{
node->c=find_s[i];
node->next=(struct buf *)malloc(sizeof(struct buf));
node=node->next;
i++;
}
flag=0;
}
break;
}
fread(&t,1,1,fp);
}
if(flag==0)
break;
if(count==(int)strlen(find_s))
{ //匹配成功
count=strlen(replace_s);
i=0;
while(i<count)
{
node->c=replace_s[i];
node->next=(struct buf *)malloc(sizeof(struct buf));
node=node->next;
i++;
}
fseek(fp,-1,SEEK_CUR);
}
else
{ //匹配失败
if(count==0)
{ //即本次while循环一个字符也不匹配
node->c=t;
node->next=(struct buf *)malloc(sizeof(struct buf));
node=node->next;
}
else
{ //即本次while循环匹配了部分字符
fseek(fp,0-count,SEEK_CUR);
node->c=find_s[0];
node->next=(struct buf *)malloc(sizeof(struct buf));
node=node->next;
}
}
}
node->next=NULL;
node->c='\0'; //注意这里最后一个节点的 node->c 是无效的

//重新写入文件
fclose(fp);
if((fp=fopen(file_name,"w"))==NULL)
{
printf("写入文件失败\n");
exit(1);
}
node=head;
while(node->next!=NULL)
{
fwrite(&node->c,1,1,fp);
node=node->next;
}
fclose(fp);
//释放空间
node=head;
while(head!=NULL)
{
head=head->next;
free(node);
node=head;
}
printf("\n操作完成\n");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式