新手C程序求改错!!!

题目见补充问题。我的代码:#include<stdio.h>#include<string.h>#definetolower(c)(c>='A'&&c<='Z'?'a'-... 题目见补充问题。
我的代码:
#include<stdio.h>
#include<string.h>
#define tolower(c)(c>='A'&&c<='Z'?'a'-A'+c;c) \\实现大小写无关转化
int main()
{
FILE *filein,*fileout;
char a[100],b[100],s[10000];
int i,k,g,j,m,n;
scanf("%s",a);
scanf("%s",b);
if((filein=fopen("filein.txt","r"))==NULL){
printf("can`t open filein.txt");
return -1;
}
if((fileout=fopen("fileout.txt","w"))==NULL){
printf("can`t open fileout.txt");
return -1;
}
i=0;
n=strlen(b);
while((fgetc(filein))!=EOF)
s[i++]=fgetc(filein); \\把filein的内容存到s[i]中
for(i=0;s[i]!='\0';i++){
for(j=i,k=0;(a[k]!='\0')&&(tolower(s[j])==tolower(a[k]));j++,k++)
; \\比较s[i]和a[k]是否相同
if(a[k]=='\0'){
for(g=i,m=0;g<i+n;g++,m++)
s[g]=b[k];
}
i=j+n-1;
}
fputc(s,fileout); \\把s输入到fileout里
fclose(filein);
fclose(fileout);
return 0;
}

1、指出错误所在
2、修改我的程序
3、for(j=i,k=0;(a[k]!='\0')&&(tolower(s[j])==tolower(a[k]));j++,k++)

这段话有很多警告。但那些警告看不懂。。如missing terminating ' charater(我用DEV-C++的)。。如果都解释一下,在原分基础上加30-50分。

谢谢!~~
如果让我觉得豁然开朗。。再追加分数以示强烈感谢~~~
好人有好报啊= =!!!
【问题描述】
编写程序将一个指定文件中某一字符串替换为另一个字符串。要求:(1)被替换字符串若有多个,均要被替换;(2)指定的被替换字符串,大小写无关。
【输入形式】
给定文件名为filein.txt。从控制台输入两行字符串(不含空格,行末尾都有回车换行符),分别表示被替换的字符串和替换字符串。
【输出形式】
将替换后的结果输出到文件fileout.txt中。
【样例输入】
从控制台输入两行字符串:
in
out
文件filein.txt的内容为:
#include <stdio.h>
void main()
{ FILE * IN;
if((IN=fopen("in.txt","r"))==NULL)
{ printf("Can’t open in.txt!");
return; }
fclose(IN);
}

【样例输出】

文件fileout.txt的内容应为:

#outclude <stdio.h>
void maout()
{
FILE * out;
if((out=fopen("out.txt","r"))==NULL)
{
prouttf("Can’t open out.txt!");
return;
}
fclose(out);
}

【样例说明】

输入的被替换字符串为in,替换字符串为out,即将文件filein.txt中的所有in字符串(包括iN、In、IN字符串)全部替换为out字符串,并输出保存到文件fileout.txt中。

PS:请尽量在我原程序基础上修改……
展开
 我来答
White_MouseYBZ
推荐于2016-07-18 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6569万
展开全部
你的代码有几个问题:
1.while((fgetc(filein))!=EOF) s[i++]=fgetc(filein)读一个字符两次用fgetc(filein),就会隔一个读一个,达不到你的愿望,见改后的while((s[i++]=fgetc(filein))!=EOF)句。
2. for(i=0;s[i]!='\0';i++){... for(j=i,k=0;(a[k]!='\0')&&(tolower(s[j])==tolower(a[k]));j++,k++)...}这一段起核心作用的代码达不到要求,也难以看懂;重写了一下在///...///之间。
3.fputc(s,fileout)想把s输入到fileout里,不能用fputc,它只拷贝一个字符,要用fputs。
4.其他改动见注释。
#include "stdafx.h"
#include "stdio.h"//
#include "windows.h"//
void main(void){
FILE *filein,*fileout;
char a[100],b[100],s[10000],*p,temp[10000];//定义一个临时字串temp和指针p
int i,n;//这里去掉多余的变量声明g,j,k,m
scanf("%s",a);
scanf("%s",b);
if((filein=fopen("filein.txt","r"))==NULL){
printf("can`t open filein.txt");
exit(-1);
}
if((fileout=fopen("fileout.txt","w"))==NULL){
printf("can`t open fileout.txt");
exit(-1);
}
i=0;
n=strlen(a);//这里改成求a的长度
while((s[i++]=fgetc(filein))!=EOF);//这里不能两次fgetc(filein),否则隔一字读一次
//////////////////////////////////////////
fclose(filein);//不用的文件立即关闭,不要等到最后
s[i-1]='\0';//在s末尾放一字串结束符
for(p=s;*p;p++){
if(!strnicmp(p,a,n)){
strcpy(temp,p+n);
*p='\0';
strcat(strcat(s,b),temp);
}
}
//////////////////////////////////////////
fputs(s,fileout);//这里要写fputs才能把s输入到fileout里
fclose(fileout);
}
追问
for(p=s;*p;p++){
if(!strnicmp(p,a,n)){
strcpy(temp,p+n);
*p='\0';
strcat(strcat(s,b),temp);
}
}

晕。。这里看不懂……
追答
for(p=s;*p;p++){//让p等于s;*p就是p的内容不等于'\0'的意思
if(!strnicmp(p,a,n)){//不计大小写,比较字串p和a的前n个字节;由于这里n是a的长度,
//所以就是比较a与p的前n个字节。与前面的for()实际上构成了在p中找有没
//有a字串。由于函数strnicmp()找到时返回0,所以前面用取反符!调整一下。
strcpy(temp,p+n);//如果找到了,就把s中a以后的字符串拷贝到临时数组temp里。这
//里的目的是a和b长度不等时,s中的字符位置要调整,不然会放不下b或
//遗留下s中已找出的属于a的最后几个字符
*p='\0';//将s中找到的a的第一个字符位置设置结束符,以便从这里开始存放替换的b串
strcat(strcat(s,b),temp);//把b串接到s中a开始的地方,再将temp中的字串接到b后
}
}//继续循环,在s中找a,看是否有第二个、第三个出现,直到*p=='\0'为止……
adoqq_bd
2011-12-13 · TA获得超过7050个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1610万
展开全部
#include<stdio.h>
#include<string.h>
//#define tolower(c) (c>='A'&&c<='Z'?'a'-'A'+c:c) 后面的strnicmp不区分大小写,就不要这个了
int main()
{
FILE *filein,*fileout;
char a[100],b[100],s[10000]={0},d[10000]; //s先全部置0,再弄一个数组保存替换后的串
int i,k,g,j,m,n;
scanf("%s",a);
scanf("%s",b);
if((filein=fopen("d:\\filein.txt","r"))==NULL)
{
printf("can`t open filein.txt");
return -1;
}
if((fileout=fopen("d:\\fileout.txt","w"))==NULL)
{
printf("can`t open fileout.txt");
return -1;
}
n=strlen(a);
m=strlen(b); //把相关字串的长度都求出来
fseek(filein,0,SEEK_END); //到文件尾;
i=ftell(filein); //获取文件长度;
rewind(filein); //文件指针回到开头
fread(s,1,i,filein); //把文件一次读入s数组
fclose(filein);
for(i=0,j=0;s[i]!='\0';)
{
if(strnicmp(s+i,a,n)==0) //从地址s+i开始与a比较n个字节
{
d[j]='\0'; //为strcat创造条件
strcat(d,b); //把字串b添加到d后面
i+=n;
j+=m;
}
else
{
d[j++]=s[i++];
}
}
d[j]='\0';
i=strlen(d); //求出d的长度
fwrite(d,1,i,fileout); //写入
fclose(fileout);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhangwen3790
2011-12-13 · TA获得超过224个赞
知道小有建树答主
回答量:209
采纳率:100%
帮助的人:176万
展开全部
1、宏定义有问题:分号是冒号
fgetc会将文件当前位置加一,用每读一个字符用一次就可以,且未判断越界
fputc改成fputs

2、#include<stdio.h>
#include<string.h>
//#define tolower(c)(c>='A'&&c<='Z'?'a'-A'+c;c) //实现大小写无关转化
#define tolower(c)((c)>='A'&&(c)<='Z'?'a'-A'+(c):(c)) //实现大小写无关转化
//注意冒号
#define MAXCHAR 10000
int main()
{
FILE *filein,*fileout;
char a[100],b[100],s[MAXCHAR];
int i,k,g,j,m,n;
scanf("%s",a);
scanf("%s",b);
if((filein=fopen("filein.txt","r"))==NULL){
printf("can`t open filein.txt");
return -1;
}
if((fileout=fopen("fileout.txt","w"))==NULL){
printf("can`t open fileout.txt");
return -1;
}
i=0;
n=strlen(b);
// while((fgetc(filein))!=EOF)
// s[i++]=fgetc(filein); \\把filein的内容存到s[i]中
while((s[i++]=(fgetc(filein))!=EOF)&&i<MAXCHAR-1);
s[i]='\0';
for(i=0;s[i]!='\0';i++){
for(j=i,k=0;(a[k]!='\0')&&(tolower(s[j])==tolower(a[k]));j++,k++)
; \\比较s[i]和a[k]是否相同
if(a[k]=='\0'){
for(g=i,m=0;g<i+n;g++,m++)
s[g]=b[k];
}
i=j+n-1;
}
// fputc(s,fileout); \\把s输入到fileout里
fputs(s,fileout);
fclose(filein);
fclose(fileout);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
痞星染太面15
2011-12-12
知道答主
回答量:31
采纳率:0%
帮助的人:11.7万
展开全部
你想要解决什么问题,建议你用VC++ 6.0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黑有毅丝
2011-12-12
知道答主
回答量:8
采纳率:0%
帮助的人:3.7万
展开全部
我真的没看懂题目。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式