用C语言做的程序,编程环境visual C++ 6.0。此程序分成两个部分,一是对文件文本单词的查找,二是对文本内容的替换。
程序中需要创建子文件textfile,再在该文件中创建wordtext和wordtext2,可以直接用记事本打开文件并且把需要处理的文本写入文件,打开程序就可以执行了。
程序中有的问题和疑惑,可以在评论区指出,我会尽量给大家回复。
//write by YU
//单词统计和替换 2021/02/08/
//第二次优化时间 2021/02/10/ 结构体数组排序
//第三次优化时间 2021/02/11/ 功能函数补充
//第四次又花时间 2021/02/24/ 替换函数补充
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct word{
char str[50]; //单词最大长度设为50
int cnt; //单词出现次数
}Str;
/*函数声明*/
void endscan();
int search(FILE *fp,Str words[],int *num); //寻找单词
void selectmenu(FILE*fp,Str words[],Str words2[],int *num); //总菜单
void printfp(FILE *fp); //打印节点
void memorysearch(Str words[],FILE *fp); //记录每一个单词
int writein(Str words[],int *num); //写入新文件
void printfword(int *num,Str words[]); //输出结构体数组
void Sortmenu(Str words[],int *num); //排序菜单
void wordsort1(Str words[],int *num); //结构体数组排序1
void wordsort2(Str words[],int *num); //结构体数组排序2
void searchmenu(Str words[],int *num); //查找菜单
void findword(Str words[],int *num); //单词找数 1
void findwords(Str words[],int *num); //数找单词 2
void replaceword(Str words[],int *num); //单词替换(未实现单词的文本替换)
int writenewtxt(Str words[],int *num); //写入文本函数
int addnewword(FILE*fp,Str words[],int *num); //添加单词函数
int deleteword(FILE*fp,Str words[],int *num); //删除内容函数
void printfmenu();
void printfmenu2();
void printfmenu3();
void insertkey();
void endscan() //结果观看函数
{
printf("\n点击回车继续...");
fflush(stdin);
getchar();
}
int search(FILE *fp,Str words[],int *num)
{
char tmp[50];
int n=0;
int s=0;
int i,j,neww=1; //neww标志位,判断是否为新单词
while ( fscanf(fp,"%s",tmp)!=EOF ) //fscanf从文件中获取单个字符串
{
for(j=0;tmp[j]!='\0';j++) //清除符号
{
if(tmp[j]==','||tmp[j]=='.'||tmp[j]==':'||tmp[j]=='"'||tmp[j]=='!'||tmp[j]=='//'||tmp[j]=='\\')//英文标点
tmp[j]='\0'; // 如果文本符号没有分隔开,会出错
}
neww=1;
for (i=0; i<n; i++)
{
if ( strcmp(tmp, words[i].str)==0 ) //重复的单词
{
neww=0;
words[i].cnt++;
}
}
if (neww)
{
for (j=0; tmp[j]!='\0'; j++) // 复制字符串
{
words[n].str[j] = tmp[j];
}
words[n].str[j] = '\0'; //单词末尾添加结束符
words[n++].cnt = 1; // 新单词数量+1
}
}
for (i=n-1; i>=0; i--) //单词出现次数
{
s+=words[i].cnt;
}
num[0]=n;
num[1]=s;
return *num;
}
int memorysearch(Str words[],FILE *fp,int*num) //未完成
{
char tmp[50];
int n=0;
int s=0;
int j,k;
num[2]=0;
while ( fscanf(fp,"%s",tmp)!=EOF ) //fscanf从文件中获取单个字符串
{
for (j=0; tmp[j]!='\0'; j++) // 复制字符串
{
words[n].str[j] = tmp[j];
if(tmp[j+1]==','||tmp[j+1]=='.'||tmp[j+1]==':')
{
words[n].str[j+1]='\0';
words[n+1].str[0]=tmp[j+1];
words[n+1].str[1]='\0';
n++;
k=j;
break;
}
}
words[n].str[j++]='\0'; //太难了
n++;
}
num[2]=n;
return *num;
}
void printfp(FILE *fp)
{
char str[100]; //储存字符串
while(!feof(fp))
{
memset(str,0, sizeof(str));
fgets(str,sizeof(str) - 1, fp); // 包含了换行符
printf("%s",str);
}
}
void printfword(int *num,Str words[]) //输出结构体数组
{
printf("\n一共%d个不同的单词,共出现次数%d,每个单词出现次数如下:\n",num[0],num[1]);
for (int i=num[0]-1; i>=0; i--)
{
printf("%-20s\t%3d\n", words[i].str, words[i].cnt);
}
}
void wordsort1(Str words[],int *num) //结构体数组排序1
{
int i,j;
int temp;
char s[20];
for(i=0;i<num[0]-1;i++)
{
for(j=0;j<num[0]-1-i;j++)
{
if(words[j].cnt < words[j+1].cnt)
{
temp = words[j].cnt;
words[j].cnt = words[j+1].cnt;
words[j+1].cnt = temp;
strcpy(s,words[j].str);
strcpy(words[j].str,words[j+1].str);
strcpy(words[j+1].str,s);
}
}
}
}
void wordsort2(Str words[],int *num) //结构体数组排序2
{
int i,j;
int temp;
char s[20];
for(i=0;i<num[0]-1;i++)
{
for(j=0;j<num[0]-1-i;j++)
{
if(strcmp(words[j].str,words[j+1].str)<0)
{
temp = words[j].cnt;
words[j].cnt = words[j+1].cnt;
words[j+1].cnt = temp;
strcpy(s,words[j].str);
strcpy(words[j].str,words[j+1].str);
strcpy(words[j+1].str,s);
}
}
}
}
void findword(Str words[],int *num) //单词找数
{
int n=0;//存所找单词的个数
char str[30];
printf("请输入需要查找的单词:");
fflush(stdin);
scanf("%s",str);
for(int i=0;i<num[0];i++)
{
if(strcmp(str,words[i].str)==0)
{
n=words[i].cnt;
break;
}
}
if(n!=0)
printf("\n%-10s 的出现个数为 %d\n",str,n);
else
printf("\n%-10s 没有找到\n",str);
}
void findwords(Str words[],int *num) //数找单词
{
int n,flag=1;//输入的查找数 //flag
printf("请输入需要查找的数量:");
scanf("%d",&n);
printf("数量为%d的单词有:\n",n);
for(int i=0;i<num[0];i++)
{
if(words[i].cnt==n)
{
printf("%s\n",words[i].str);
flag=0;
}
}
if(flag)
printf("其实出现次数为%d的单词一个也没有\n",n);
}
void replaceword(Str words[],int *num) //单词替换(未实现单词的文本替换)
{
int n=0;
char str1[30],str2[30];
printf("请输入替换前的单词:");
fflush(stdin);
scanf("%s",str1);
printf("请输入替换后的单词:");
fflush(stdin);
scanf("%s",str2);
for(int i=0;i<num[2];i++)
{
if(strcmp(str1,words[i].str)==0)
{
strcpy(words[i].str,str2);
n++;
}
}
if(n!=0)
printf("\n%-10s 已经替换 %-10s\n",str1,str2);
else
printf("\n%-10s 没有找到\n",str1);
}
int writein(Str words[],int *num)
{
FILE *fp3;
if((fp3=fopen("textfile/wordtext2","w+"))==NULL)
{
printf("cannot open the file!\n");
return 1;
}
int i;
for(i=0;i<num[2];i++)
{
fprintf(fp3,"%s",words[i].str);
fprintf(fp3,"%c",' ');
}
rewind(fp3);
printf("文件内容输入如下;\n");
printfp(fp3);
printf("\n添加成功!\n");
fclose(fp3);
}
int writenewtxt(Str words[],int *num)//写入文本函数
{
FILE *fp2;
if((fp2=fopen("textfile/wordtext","a+"))==NULL)
{
printf("cannot open the file!\n");
return 1;
}
printf("请输入需要写入的文本:\n");
char str[1024];
fflush(stdin);
gets(str);
for(int i=0;i<=strlen(str);i++)
{
str[strlen(str)+1-i]=str[strlen(str)-i];
}
str[0]=' ';
str[strlen(str)+2]='\0';
fprintf(fp2,"%s",str);
rewind(fp2);
printfp(fp2);
printf("\n添加成功!\n");
fclose(fp2);
}
int addnewword(FILE*fp,Str words[],int *num)//添加单词函数
{
FILE *fp2;
if((fp2=fopen("textfile/wordtext","a+"))==NULL)
{
printf("cannot open the file!\n");
return 1;
}
printf("请输入添加的单词:");
char str[30];
fflush(stdin);
gets(str);
for(int i=0;i<=strlen(str);i++)
{
str[strlen(str)+1-i]=str[strlen(str)-i];
}
str[0]=' ';
str[strlen(str)+2]='\0';
fprintf(fp2,"%s",str);
rewind(fp2);
printfp(fp2);
printf("\n添加成功!\n");
fclose(fp2);}
int deleteword(FILE*fp,Str words[],int *num)//删除函数
{
FILE *fp2;
if((fp2=fopen("textfile/wordtext","a+"))==NULL)
{
printf("cannot open the file!\n");
return 1;
}
char str[50];
printf("请输入需要删除的单词:");
fflush(stdin);
gets(str);
int flag = 0;
for(int i=0;i<num[2];i++)
{
if(strcmp(str,words[i].str)==0)
{
memset(words[i].str,0,strlen(words[i].str));
flag = 1;
}
}
if(flag==1)
printf("\n删除成功!\n");
fclose(fp2);
}
void printfmenu()
{
printf("---------------------------------------------\n");
printf(" <单词的查找与替换> 2.0 \n");
printf("---------------------------------------------\n");
printf(" | <1> 输出文档内容 (wordtext) \n");
printf(" 查找| <2> 输出扫描的单词(wordtext) \n");
printf(" | <3> 单词排序 (wordtext) \n");
printf(" | <4> 单词数量查找 (wordtext) \n");
printf(" | <5> 加载文件 (wordtext) \n");
printf(" | <6> 写入文件 (wordtext) \n");
printf(" | <7> 添加单词 (wordtext) \n");
printf(" \n");
printf(" | <8> 删除单词 (wordtext2) \n");
printf(" 替换| <9> 文件内容整理 (wordtext2) \n");
printf(" | <10> 替换单词 (wordtext2) \n");
printf(" | <11> 写入文件 (wordtext2) \n");
printf("---------------------------------------------\n");
printf(" <0> 退出 \n");
printf("---------------------------------------------\n");
printf("请选择:");
}
void printfmenu2()
{
printf("-----------------------------\n");
printf(" 单词排序 \n");
printf("-----------------------------\n");
printf(" \n");
printf(" <1>个数排序 \n");
printf(" <2>单词排序 \n");
printf(" <0>返回菜单 \n");
printf("-----------------------------\n");
printf("请选择:");
}
void Sortmenu(Str words[],int *num)
{
system("cls");
printfmenu2();
int a;
scanf("%d",&a);
switch(a)
{
case 0:
break;
case 1:
wordsort1(words,num);
insertkey();
break;
case 2:
wordsort2(words,num);
insertkey();
break;
}
}
void printfmenu3()
{
printf("-----------------------------\n");
printf(" 单词数量查找 \n");
printf("-----------------------------\n");
printf(" \n");
printf(" <1>查找一个单词的数量 \n");
printf(" <2>查找相同数量的单词 \n");
printf(" <0>返回菜单 \n");
printf("-----------------------------\n");
printf("请选择:");
}
void searchmenu(Str words[],int *num)
{
system("cls");
printfmenu3();
int a;
scanf("%d",&a);
switch(a)
{
case 0:
break;
case 1:
findword(words,num);
break;
case 2:
findwords(words,num);
break;
}
}
void insertkey()
{
printf("\t\t加载中...\n");
Sleep(2000);
printf("\t\t加载成功!\n");
Sleep(1000);
}
void selectmenu(FILE*fp,Str words[],Str words2[],int *num)
{
int v=0;
while(v!=1)
{
int s;
int i,j;
printfmenu(); //打印菜单
printf("请输入选项:");
scanf("%d",&s);
switch(s)
{
case 0:
v=1;
break;
case 1:
printfp(fp); //输出文档内容
rewind(fp); //输出之后从头开始
break;
case 2:
printfword(num,words);
break;
case 3:
Sortmenu(words,num);
break;
case 4:
searchmenu(words,num);
break;
case 5:
fp = fopen("textfile/wordtext", "r");
search(fp,words,num); //查找单词写入结构体
rewind(fp);
insertkey();
break;
case 6:
writenewtxt(words,num);
break;
case 7:
addnewword(fp,words2,num);
break;
case 8:
deleteword(fp,words2,num);
for(i=0;i<num[2];i++)
{
for(j=0;words2[i].str[j]!='\0';j++)
{
printf("%c",words2[i].str[j]);
}
printf(" ");
}
break;
case 9:
*num=memorysearch(words2,fp,num);
rewind(fp);
for(i=0;i<num[2];i++)
{
for(j=0;words2[i].str[j]!='\0';j++)
{
printf("%c",words2[i].str[j]);
}
printf(" ");
}
break;
case 10:
replaceword(words2,num);
for(i=0;i<num[2];i++)
{
for(j=0;words2[i].str[j]!='\0';j++)
{
printf("%c",words2[i].str[j]);
}
printf(" ");
}
break;
case 11:
writein(words2,num);
break;
default:printf("输入错误!\n");
}
if(v!=1)
{
endscan();
system("cls");
}
}
}
int main() //主调函数
{
FILE *fp;
int num[3]={0,0,0}; //实际单词数量 //单词出现次数
Str words[1000]; //单词数量上限
Str words2[1000];
if((fp = fopen("textfile/wordtext", "r"))==NULL)
{
printf("cannot open the file!\n");
endscan();
return 0;
}
search(fp,words,num); //查找单词写入结构体
rewind(fp);
selectmenu(fp,words,words2,num);//菜单选择
fclose(fp);
return 0;
}