文本编辑系统的设计与实现

13.简易文本编辑系统的设计与实现
基本要求:输入一页文字,可以统计出文字、数字、空格的个数。
(1)利用外部.txt文件存储一页文章,每行最多不超过80个字符,共N行。
(2)分别统计出其中英文字母和空格数及整篇文章总字数。
(3)统计某一字符串在文章中出现的次数,并输出该次数。 
(4)删除某一子串,并将后面的字符前移,对文章的修改,同步到.txt文件中。
提高部分:采用顺序和链式两种存储结构实现。

 

代码如下,如有帮助,请采纳一下,谢谢。

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

#define N 20

//查找big中出现smal的次数
void findstr(char*big ,char* smal,int pos[],int *nmb)
{
	int i,j,lenb,lens;
	lenb = strlen(big);
	lens = strlen(smal);
	*nmb = 0;
	if(lens > lenb)
		return;

	i = 0;
	while(i < lenb-lens+1)
	{
		for (j = 0; j < lens;j++)
		{
			if(tolower(big[i+j]) != tolower(smal[j])) //不区分大小写,如果区分大小写,则去掉tolower
				break;
		}
		if (j == lens) //说明找到
		{
			pos[*nmb] = i;
			(*nmb)++;
			i += lens;
		}else
			i++;
	}
}

int main()
{
	int row = 0;//文本实际的行数
	FILE* fp;   //文件指针
	char buf[N][100]={0}; //缓存每行文本数据
	
	int nmbZm = 0,nmbSz = 0,nmbSpace = 0,total = 0;//字母数、数字数、空格数、总字符数

	int times = 0; //某个单词出现的次数
	int pos[100];  //记录单词出现的位置
	char smal[20]={0};//需要查找的字符串

	int i,j,tmp = 0;//临时变量
	char hc[100]={0};//临时变量--删除字符串时使用
	
	if (!(fp= fopen("a.txt","r")))
	{
		printf("文件打开失败\n");
		return 0;
	}
	printf("开始读文件...\n");
	while(!feof(fp))
	{
		memset(buf[row],0,100);
		fgets(buf[row],100,fp);//逐行读取文件
		row++;		
	}
	fclose(fp);

	//1.统计英文字母、数字、空格、总文本长度
	for (i = 0;i<row;i++)
	{
		total += strlen(buf[i]);
		for(j=0;j<strlen(buf[i]);j++)
		{
			if( (buf[i][j]>= 'a' && buf[i][j] <='z') || (buf[i][j]>= 'A' && buf[i][j] <='Z') )
				nmbZm++;
			else if(buf[i][j]>= '0' && buf[i][j] <='9')
				nmbSz++;
			else if(buf[i][j] == ' ')
				nmbSpace++;
		}
	}

	printf("字母的个数:%d\n",nmbZm);
	printf("数字的个数:%d\n",nmbSz);
	printf("空格的个数:%d\n",nmbSpace);
	printf("文本总字符数:%d\n",total);

	//2.查询某个字符出现的次数
	printf("请输入要查找的字符串:");
	scanf("%s",smal);
	for (i = 0;i<row;i++)
	{
		findstr(buf[i],smal,pos,&tmp);
		times += tmp;
	}
	printf("%s出现的次数:%d\n",smal,times);

	//3.删除某个字符串(删除所有行中出现的字符串),并写入文件
	if(!(fp = fopen("a.txt","w")))
	{
		printf("文件打开失败\n");
		return 0;
	}
	memset(smal,0,20);
	printf("请输入需要删除的字符串:");
	scanf("%s",smal);
	for (i=0;i<row;i++)
	{
		findstr(buf[i],smal,pos,&tmp);
		tmp--;
		while(tmp>=0)
		{
			memcpy(buf[i]+pos[tmp],buf[i]+pos[tmp]+strlen(smal),strlen(buf[i])- strlen(smal) - pos[tmp]);
			tmp--;
			buf[i][strlen(buf[i])- strlen(smal)] = '\0';
		}
		//
		fputs(buf[i],fp);
	}
	fclose(fp);

	return 0;
}