设计一个文本编辑系统(c语言完成)

简易文本编辑系统的设计与实现基本要求:
输入一页文字,可以统计出文字、数字、空格的个数。
(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;
}

这个和你的问题一样
https://ask.csdn.net/questions/7457013

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