字符查找、统计、文本修改

功能描述

1.从文件中逐行读取内容,并统计字母个数、数字个数、空格个数以及文本总字符数

2.查找某个字符串出现的次数

3.删除某个字符串,并替换原文件的内容

(问题来源CSDN问答)

代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qfl_sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值