#include<stdio.h>
#include<string.h>
void userinput(char filename[],char wrongword[],char rightword[]);
char readfile(int *numr,char filename[]);
char storefile(int numr,char filename[],char data[][BUFSIZ]);
void findandreplace(char filename[],char wrongword[],char rightword[],char data[][BUFSIZ],int numr);
int main()
{
int numberofrows;
char filename[10],wrongword[10],rightword[10],data[5][BUFSIZ];
userinput(filename,wrongword,rightword);
readfile(&numberofrows,filename);
storefile(numberofrows,filename,data);
findandreplace(filename,wrongword,rightword,data,numberofrows);
}
在第一个功能中,用户输入所需信息
void userinput(char filename[],char wrongword[],char rightword[])
{
printf("Enter the name of the file\n");
gets(filename);
printf("Enter the misspelled word\n");
gets(wrongword);
printf("Enter the properly spelled word\n");
gets(rightword);
}
第二个函数计算文件中的行数
char readfile(int *numr,char filename[])
{
FILE *infile;
char ch;
int count=0;
infile=fopen(filename,"r");
if (infile == NULL)
{
printf("Could not open file %s",filename);
}
for(ch=fgetc(infile);ch!=EOF;ch=fgetc(infile))
{
if(ch=='\n')
{
count=count+1;
}
}
*numr=count;
fclose(infile);
}
第三个函数将文本文件存储在2D数组中,并删除fgets添加的尾部换行符。
char storefile(int numr,char filename[],char data[][BUFSIZ])
{
FILE *infile;
int length,i=0;
infile=fopen(filename,"r");
if (infile == NULL)
{
printf("Could not open file %s",filename);
}
for(i=0;i<numr;i++)
{
fgets(data[i],BUFSIZ,infile);
}
fclose(infile);
}
第四个函数返回在文本文件中找到的错误单词的第一个字符的地址,并在那里形成我可以找到从我需要添加的字符串开头有多少个字符到第一个字母表错字。但如果正确的单词比错误的单词长,则正确的单词会更改相邻单词的字母。如果正确的单词短于错误的单词,则右单词后面的剩余行会消失。
我似乎不明白发生了什么以及如何解决问题。
void findandreplace(char filename[], char wrongword[], char rightword[],char data[][BUFSIZ],int numr)
{
FILE *infile;
FILE *outfile;
char *ptr1, *ptr2,filearray[BUFSIZ];
infile=fopen(filename,"r");
if(infile==NULL)
{
printf("Could not open file %s\n",filename);
}
outfile=fopen("text","w");
if(infile==NULL)
{
printf("Could not open file");
}
while(!feof(infile))
{
for(int i=0;i<numr;i++)
{
if (strstr(data[i], wrongword))
{
ptr2 = &data[0][0];
while (ptr1 = strstr(ptr2,wrongword))
{
while (ptr2 != ptr1)
{
fputc(*ptr2,outfile);
ptr2++;
}
ptr1 = ptr1 + strlen(wrongword);
fprintf(outfile, "%s", rightword);
ptr2 = ptr1;
}
while(ptr2!='\0')
{
fputc(*ptr2,outfile);
ptr2++;
}
}
}
else
{
for(int i=0;i<numr;i++)
fputs(data[i],outfile);
}
}
}
我仔细检查了我的代码,似乎没有丢失括号。任何人都可以指出我犯错误的地方吗?
答案 0 :(得分:0)
在readfile()
中,要计算文件中的行数,请尝试使用fgets()
char str[100];
for(; fgets(str, sizeof(str), stdin)!=NULL; )
{
count=count+1;
}
fgets()
会在出错时返回NULL
。
强烈建议不要使用gets()
,现在已弃用。请改用fgets()
。请参阅here。
即使fopen()
向其返回NULL
,您也在使用文件指针。你需要改变它。
在storefile()
中,您可能需要检查fgets()
的返回类型以确保其成功。而且无需将data[i][length-1]
投射到int
。 char
实际上只是一个整数。
你可以在这里计算文件中的行数而不是在单独的函数中进行计数。
您可能会收到NULL
因为文件的第一行存储在data[0]
(或*data
)中,但不包含wrongword
。当strstr()
不是NULL
的子字符串时,wrongword
会返回*data
。
也许您想要遍历data
的所有元素。您可以使用之前获得的行数。
for(i=0; i<noOfLines; ++i)
{
pa=strstr(data[i],wrongword);
}
了解strstr()
here。