C语言 单词的查找和替换

该博客介绍用C语言编写的程序,编程环境为visual C++ 6.0。程序包含两部分,分别是对文件文本单词的查找和文本内容的替换。需创建子文件textfile及其中的wordtext和wordtext2,写入文本后即可运行程序,有问题可在评论区提出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值