功能描述
1.从文件中逐行读取内容,并统计字母个数、数字个数、空格个数以及文本总字符数
2.查找某个字符串出现的次数
3.删除某个字符串,并替换原文件的内容
(问题来源优快云问答)
代码
#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;
}