溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言如何實(shí)現(xiàn)簡易文本編譯器

發(fā)布時(shí)間:2021-05-10 10:54:09 來源:億速云 閱讀:346 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)C語言如何實(shí)現(xiàn)簡易文本編譯器,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

C語言是什么

C語言是一門面向過程的、抽象化的通用程序設(shè)計(jì)語言,廣泛應(yīng)用于底層開發(fā),使用C語言可以以簡易的方式編譯、處理低級存儲器。

數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之簡易文本編譯器(C語言實(shí)現(xiàn))

需求分析

(1)具有圖形菜單界面:顯示實(shí)時(shí)年份,日期,星期及時(shí)間

(2)

 查找:查找文本中的字符串,顯示其出現(xiàn)的行數(shù),列數(shù)及總共出現(xiàn)次數(shù)

 替換(等長,不等長):對文本中的文本實(shí)現(xiàn)等長及不等長替換

 插入(插串,文本塊的插入):插入一行或在具體行號列號處插入文本

 塊移動(dòng)(行塊,列塊移動(dòng)):向下移動(dòng)一行,向上移動(dòng)一行,

                         具體行號列號處向左移動(dòng)或向右移動(dòng)

 刪除:刪除一行,刪除莫一行,莫列,定長的內(nèi)容

(3)可正確存盤、取盤;:可讀取,保存文本;

(4)正確顯示總行數(shù)。(行數(shù)不少于5行,每行字符數(shù)不少于80個(gè)字符)

采用的數(shù)據(jù)結(jié)構(gòu)

1:采用的邏輯結(jié)構(gòu)

文本編輯器主要是針對文本進(jìn)行編輯,文本的操作就是對字符的操作。文本編輯器可以從行、

列兩個(gè)方向進(jìn)行編輯。

每一行可以看成一個(gè)線性表,線性表是一種線性結(jié)構(gòu),線性結(jié)構(gòu)的特點(diǎn)是數(shù)據(jù)元素之間為線性

關(guān)系,據(jù)元素“一個(gè)接一個(gè)的排列”。在一個(gè)線性表中數(shù)據(jù)元素的類型是相同的,由于每一行

可以存儲的最大字?jǐn)?shù)是相同的,行方向所有線性表的最大長度可以設(shè)置成相同的。行與行之間

的關(guān)系也可以看成一個(gè)線性表。

2.采用的存儲結(jié)構(gòu)

線性表的存儲分為兩種:順序存儲和鏈?zhǔn)酱鎯Α?/p>

順序存儲是指在內(nèi)存中用地址連續(xù)的一塊存儲空間順序存放線性表的各元素,用這種存儲形式

存儲的線性表稱為順序表。在程序設(shè)計(jì)語言中,一維數(shù)組在內(nèi)存中占用的存儲空間就是一組連續(xù)

的存儲區(qū)域,因此,用一維數(shù)組來表示順序表的數(shù)據(jù)存儲區(qū)域是再合適不過的。

鏈?zhǔn)酱鎯κ峭ㄟ^-組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素的,為建立數(shù)據(jù)元系之間的線性

關(guān)系對每個(gè)數(shù)據(jù)元素除了存放數(shù)據(jù)元素自身的信息之外,還需要和一起存放其后繼或前驅(qū)所在的

存儲單元的地址,這兩部分信息組成一個(gè)“結(jié)點(diǎn)”,每個(gè)元素都如此。存放數(shù)據(jù)元素信息的稱為

數(shù)據(jù)域,存放其前驅(qū)或后繼地址的稱為指針域。只有一個(gè)存儲單元地址的為單鏈表,有兩個(gè)存儲

單元地址的為雙鏈表。

考慮到實(shí)際的功能需求,每行的線性表可以用順序存儲方式,每個(gè)字符是一個(gè)節(jié)點(diǎn)。用數(shù)組的長

度表示本行可以輸入的最大字符。行與行之間的線性表采用雙鏈表存儲,每個(gè)節(jié)點(diǎn)包括四個(gè)區(qū)域,

一個(gè)指針域prior指向上一行,一個(gè)指針域next指向下一行,一個(gè)數(shù)據(jù)域num是行號,一個(gè)數(shù)據(jù)

域是本行的字符數(shù)組。程序以行和列標(biāo)識文本位置,行采用雙向鏈表存儲行信息,用數(shù)組下標(biāo)標(biāo)識

列信息,從而能夠準(zhǔn)確定位字符位置,然后進(jìn)行查找、替換、插入、塊移動(dòng)、刪除等多種操作。

函數(shù)功能模塊圖:

C語言如何實(shí)現(xiàn)簡易文本編譯器

定義的結(jié)構(gòu)體:

struct line

{

    char  text[MAX_LEN];      //本行的文本 
    int num;                 //行號
    struct line *next;       //指向下一行的指針 
    struct line *prior;      //指向前一行的指針 

 };

代碼如下(僅供參考)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#define MAX 240
#define NOT_FOUND -1
//函數(shù)聲明  
void HeadWord(void);      //輸出大標(biāo)題,永遠(yuǎn)出現(xiàn)在程序的最頂端。  
void PrintWord(void);    //輸出文本的內(nèi)容 
void printf_time();      //輸出時(shí)間和日期,星期及年月日 
void scanf_load();       //從鍵盤錄入文本 
void file_load();        //把文本文件的內(nèi)容讀到線性表中
void findstr();          //查找字符串 
void delete1(int linenum);//刪除一行
void delete2(int linenum,int position,int lenth);//刪除莫一行,莫列,定長的內(nèi)容 
void insert1();           // 插入一行文字
void insert2(char str[], int linenum, int position);//插入文字到文本莫一行莫一列
void replace();          //替換
void Mainmenu();          //主菜單
void menu1();                //文件錄入方式菜單
void menu2();               //文本內(nèi)容處理菜單
void menu_move();          //移動(dòng)菜單 

//定義結(jié)構(gòu)體
struct line
{
 char text[MAX];      //該行的內(nèi)容 
 int num;                 //用來記錄行號
 struct line *prior;      //用來指向前一行
 struct line *next;       //用來指向下一行
 };
struct line *start;          //指向線性表的第一行
struct line *last;           //指向線性表的最后一行

//主函數(shù) 
int main()
{ 
 
 Mainmenu();
 return 0; 
}

//輸出標(biāo)題,永遠(yuǎn)出現(xiàn)在程序的最頂端。 
void HeadWord()
{
 
printf("\t\t ____________________________________________________\n\n");
printf("\t\t****    Welcom to use our TXT edition system!    ****\n");
printf("\t\t ____________________________________________________\n");
}

//  輸出鏈表的內(nèi)容 
void PrintWord()
{
 
 struct line *p = start;
 while(p != last)
 {
  printf("\n\t\t第%d行|%s",p->num,p->text);
  p = p->next;
 }
 printf("\n\t\t第%d行|%s",last->num,last->text);
  printf("\n");
}


//輸出時(shí)間和日期 
void printf_time()
{
 
 time_t timep;
 struct tm *p;
 time (&timep);
 p=gmtime(&timep);
 //年月日 
 printf("\t\t|Data:%d-%d-%d  |",1900+p->tm_year,1+p->tm_mon,p->tm_mday);
 
 //顯示星期幾
  printf("Today is ");
 switch (p->tm_wday)
    {
    case 7:   
        printf("Sunday   |");
        break; 
    case 1:   
        printf("Monday   |");
        break;
    case 2:   
        printf("Tuesday  |");
        break;
    case 3:  
        printf("Wednesday|");
        break;
    case 4: 
        printf("Thursday |");
        break;
    case 5:  
        printf(" Friday  |");
        break;
    case 6:  
        printf("Saturday |");
        break;
    default:
        break; } 
 //讓時(shí)間固定顯示為 08:04:11類型,即當(dāng)時(shí),分,秒小于十時(shí)前加零 
 if(p->tm_hour+8<10&&p->tm_min>10&&p->tm_sec>10)
 printf("Time:0%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec>10)
 printf("Time:0%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec); 
 else if(p->tm_hour+8<10&&p->tm_min<10&&p->tm_sec<10)
 printf("Time:0%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec); 
 else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec<10)
 printf("Time:%d:0%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec<10) 
 printf("Time:%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min>=10&&p->tm_sec>=10)
 printf("Time:%d:%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8>=10&&p->tm_min<10&&p->tm_sec>=10)
 printf("Time:%d:0%d:%d |",p->tm_hour+8,p->tm_min,p->tm_sec);
 else if(p->tm_hour+8<10&&p->tm_min>=10&&p->tm_sec<10)
 printf("Time:0%d:%d:0%d |",p->tm_hour+8,p->tm_min,p->tm_sec);

 
} 

//把文本文件的內(nèi)容讀到線性表中
void file_load()
{
 struct line *info,*temp;                 //行指針,info指向當(dāng)前行,temp指向info的前驅(qū)行 
 char ch;
 temp = NULL;
 int linenum,i;          //行計(jì)數(shù)器,行字符數(shù)組下標(biāo) 
 FILE *fp;                             //文件指針 
 char name[20];
 printf("請輸入要打開文件名字(例如c:\\a.txt)");
 scanf("%s",name);  
 while ((fp=fopen(name,"r"))==NULL)
 {
   printf("\n打開文件失敗,請重新輸入要打開的文件名:");
   scanf("%s",name);
    }
 start = (struct line*)malloc(sizeof(struct line));     //生成一行的結(jié)點(diǎn)空間 
 info = start;
 linenum = 1;
 
 while((ch = fgetc(fp)) != EOF)
 {     
   i = 0;
   info->text[i] = ch;
   i++;
   while((ch = fgetc(fp)) != '\n')      //從文件中讀到一行字符到線性表中 
   { 
    info->text[i] = ch;
    i++;
   }
 info->num = linenum++;
 info->next = (struct line*)malloc(sizeof(struct line));
 if (!info->next)
 {
  printf("\n\t\t內(nèi)存不足"); 
  getchar();
  exit(0);
 }

 temp = info;
 info = info->next;
 info->prior = temp;
  } 
  last = info->prior;
  printf("\t\t文件讀入完畢\n"); 
  fclose(fp);
  
}

//從鍵盤錄入文本 
void scanf_load()
{ 
 struct line *info,*temp;                 //行指針,info指向當(dāng)前行,temp指向info的前驅(qū)行 
 char ch;
 temp = NULL;
 int linenum,i;          //行計(jì)數(shù)器,行字符數(shù)組下標(biāo) 
 FILE *fp;                                 //文件指針 
 temp = NULL;
 start = (struct line*)malloc(sizeof(struct line));     //生成一行的結(jié)點(diǎn)空間 
 info = start;
 linenum = 1;
 printf("\t\t請從鍵盤錄入文本(輸入時(shí)回車換行,輸入結(jié)束后在新的一行輸入#結(jié)束錄入)\n\t\t"); 
 while((ch = getchar()) !='#')
 {
   i = 0;
   info->text[i] = ch;
   i++;
   while((ch = getchar()) != '\n')      //從文件中讀到一行字符到線性表中 
   {
    
    info->text[i] = ch;
    i++;
   
   }
 printf("\t\t");  
 info->text[i] = '\0';
 info->num = linenum++;
 info->next = (struct line*)malloc(sizeof(struct line));
 if (!info->next)
 {
  printf("\n\t\t內(nèi)存不足"); 
  getchar();
  exit(0);
 }
 info->prior = temp;
 temp = info;
 info = info->next;
  } 
  temp->next = NULL;
  last = temp;
  free(info);
  start->prior = NULL;
 
 
}

//文件保存
void save()
{
    system("cls");
 FILE *fp;
    line *info=start;
 int i=0;
    char name[20];
 printf("\n請輸入保存地址(例如: c:\\a.txt):");
 scanf("%s",name);
  while ((fp=fopen(name,"w+"))==NULL)
  {
   printf("文件不存在,請重新輸入文件名:");
   scanf("%s",name);
  } 
 while(info)
 {   
        while(info->text[i]!='\n')  
  {fprintf(fp,"%c",info->text[i]);
   i++;
  }
  info = info->next;
  i = 0;
 }
     
        fclose(fp);
  printf("\n文件保存成功\n"); 

} 

 //查找字符串 
void findstr(){

 PrintWord();
 char str[MAX];
 getchar();
 printf("\t\t 輸入想要查找的字符串:");
 gets(str);
 printf("\t\t|>>________________________________________________<<|\n");
   struct line *info;
 int i = 0, find_len, found = 0, position;
 char substring[MAX];
 info = start;
 int find_num = 0;             //匹配到的次數(shù) 
 find_len = strlen(str);
 while (info)   //查詢
 { 
  
  i = 0;  //行間循環(huán)
  while (i <= (strlen(info->text) - find_len))  //行內(nèi)查找循環(huán)
  { int k=0;
   
   for(int j=i;j<i+find_len;j++)   // 行內(nèi)的字符串從第一個(gè)開始按定長find_len賦給substring 
   { 
    substring[k] = info->text[j]; 
    k++;
   }
   if (strcmp(substring,str) == 0)
   { 
    find_num++;
   
    printf("\t\t|第%d次出現(xiàn)在:%d行%d列\(zhòng)n",find_num,info->num,(i+1+1)/2);
    found = 1;
   }
    i++;
  }
  info = info->next;
 }
 if (found)  //查找成功
  printf("\t\t|\t\t該內(nèi)容出現(xiàn)的總次數(shù)為%d\n",find_num);
 else   //查找不成功
  printf("\t\t該內(nèi)容不存在\n");
 printf("\t\t|>>________________________________________________<<|\n");
 
}

//刪除一行
void delete1(int line_num)
{ 
 struct line * info, *p;
 info = start;
 while ((info->num < line_num) && info)  //尋找要?jiǎng)h除的行 
  info = info->next;
 if (info == NULL)
  printf("該行不存在");
 else
 {
  p = info->next;     //指向要?jiǎng)h除的行后面一行 
  if (start == info) //如果刪除的是第一行
  {
   start = info->next;
   if (start)  //如果刪除后,不為空
    start->prior = NULL;
   else  //刪除后為空
    last = NULL;
  }
  else
  {
   info->prior->next = info->next;  //指定行的上一行指向指定行的下一行
   if (info != last) //如果不是最后一行
    info->next->prior = info->prior;  //修改其下一行的指向頭的指針 
   else  //如果是最后一行,修改尾指針
    last = info->prior;
  }
  free(info);
  while (p) //被刪除行之后的行號減一 
  {
   p->num = p->num - 1;
   p = p->next;
  }

 }

}

//刪除莫一行,莫列,定長的內(nèi)容 
void delete2(int line_num,int position,int lenth)
{ 
 
 struct line *info=start;
 char rest_str[MAX];
 if(line_num == 1)
 info = start;
 else
 for(int i=1;i<line_num;i++)       //讓info指向刪除內(nèi)容所在行 
 info = info->next;      
 if (info == NULL)
  printf("該行沒有字符!n");
 else
 {
  if (strlen(info->text) <= (position + lenth))  //本行的字符長度<=待刪除的列號+刪除長度,直接在當(dāng)前位置插入'\0'
   info->text[position] = '\0';
  else
  { int i;
   for(i = position-1;info->text[i+lenth]!='\0';i++)
   info->text[i]=info->text[i+lenth];
   info->text[i]='\0';
  }
 }
}


// 插入一行文字
void insert1()
{ 
 int linenum; 
 printf("\t\t輸入插入位置的行號:");
 scanf("%d", &linenum);
 struct line * info, * q, * p;
 p = start;
 q = NULL;

 while (p && p->num != linenum)               
 {
  q = p;    //插入行前面一行 
  p = p->next;    //插入行后面一行
 }

 if (p == NULL && (q->num + 1) != linenum) //指定行不存在,不能插入
 {
  printf("\t\t輸入的行號不存在");
 }

 else // 指定行存在,進(jìn)行插入
 {
  info = (struct line *)malloc(sizeof(struct line));
  printf("\t\t輸入要插入的字符串:");
  scanf("%s", info->text);
  info->num = linenum;
  if (linenum == 1)       //插入在第一行
  {
   info->next = p;
   p->prior = info;
   info->prior = NULL;
   start = info;
  }

  else if (q->num != linenum)  //插入在最后一行
  {
   q->next = info;
   info->next = p;
   info->prior = q;
  }

  else     //插入在其他行
  {
   q->next = info;
   info->next = p;
   p->prior = info;
   info->prior = q;
  }

  while (p)   //如果不是插入在最后一行,插入行后面的行號都加1
  {
   p->num = p->num + 1;
   p = p->next;
  }

 }

}

//插入文字到文本莫一行莫一列
void insert2(char str[], int linenum, int position)
{
 
 struct line * info;
 int len, i;
 int lenth;
 char rest_str[MAX],kongge[2] = { " " };
 info = start;
 while (info && info->num != linenum)   //查詢要插入的行
 {
  info = info->next;
 }
 if (info == NULL)
  printf("不存在該行!\n");
 else if (position < 0)
  printf("不存在該列!\n");
 else    //如果行和列都存在,則進(jìn)行插入
 {
  lenth = strlen(info->text);
  if (lenth < position) //插入列大于本行文件列數(shù)
  {
   len = position - lenth - 1;
   for (i = 0; i < len; i++)
   strcat(info->text, kongge);   //將空余的部分插入空格符
   strcat(info->text, str);    //插入字符到列的未尾
  }

  else   //插入列在本行文字的中間
  {
   strcpy(rest_str, &info->text[position - 1]);
   strcpy(&info->text[position - 1], str);
   strcat(info->text, rest_str);
  }
 }
} 
 
//替換
void replace()
{
 PrintWord();
 char str[MAX];
 printf("\t\t輸入想要替換的字符串:\t\t");
 scanf("%s",&str);
 char replace[MAX]; 
 printf("\t\t替換為:"); 
 scanf("%s",&replace);
   struct line *info;
 int i = 0, find_len, found = 0, position;
 char bijiao[MAX];
 info = start;
 int find_num = 0;             //匹配到的次數(shù) 
 find_len = strlen(str);
 while (info)   //查詢
 { 
  
  i = 0;  //行間循環(huán)
  while (i <= (strlen(info->text) - find_len))  //行內(nèi)查找循環(huán)
  { int k=0;
   
   for(int j=i;j<i+find_len;j++)   // 行內(nèi)的字符串從第一個(gè)開始按定長find_len賦給substring 
   { 
    bijiao[k] = info->text[j]; 
    k++;
   }
   if (strcmp(bijiao,str) == 0)
   { 
    find_num++;
    delete2(info->num,i+1,find_len);
    insert2(replace,info->num,i+1);
    found = 1;
   }
    i++;
  }
  info = info->next;
 }
 if (found)  //查找成功
  printf("\t\t該內(nèi)容替換的總次數(shù)為%d\n",find_num);
 else   //查找不成功
  printf("\t\t該內(nèi)容不存在\n");
 printf("\t\t經(jīng)過替換后的內(nèi)容為:\n");
 PrintWord();
 
 
 } 

//文件錄入方式菜單
void menu1()
{ 
 printf("\t\t|請選擇錄入方式    1:從鍵盤輸入     2:從文件錄入   |\n\t\t");
 int i;
 scanf("%d",&i);
 getchar();
  if(i>2||i<1)    
 {   
  printf("\t\t對不起,請輸入正確的功能序號!\n");
 }
 switch(i)
 {
  case 1:
   scanf_load();
   system("cls"); 
   break;
  case 2:
   file_load();
   system("cls"); 
   break;     
  } 
}

//移動(dòng)菜單 
void menu_move()
{ 
 
 int choice;
 printf("\n\t\t|_____________________移動(dòng)操作_______________________|\n");
 printf("\n\t\t|----->1.    向下移動(dòng)一行                <-----------|\n");
 printf("\t\t|----->2.    向上移動(dòng)一行                <-----------|\n");
 printf("\t\t|----->3.    向右移動(dòng)一列                <-----------|\n");
 printf("\t\t|----->4.    向左移動(dòng)一列                <-----------|\n");
 printf("\t\t|----->5.    返回上級菜單                <-----------|\n");
 printf("\t\t請選擇");
 scanf("%d",&choice); 
 int line_num,number;
 char str[2];
 switch (choice)
   {
   case 1:   // 向下移動(dòng)一行
    
    printf("\t\t輸人要移動(dòng)的字符串所在行號:");
    scanf("%d", &line_num);
    struct line *info,*p;                    //新建一行空行 
    info = (struct line *)malloc(sizeof(struct line));
    info->text[0] = ' ';
    info->text[1] = '\0';
    info->num = line_num;
    if (line_num == 1)    //插入在首行
    { 
     info->next = start;
     start->prior = info;
     start = info;
     start->prior = NULL;
     p=start->next;
    }
    else  //插入在其他行
          {
          p=start;
       while (p->num != line_num)
     p = p->next;                    //令p指向插入行 
    info->next=p;
    info->prior=p->prior;
    p->prior->next=info;
    p->prior = info;}
    while (p)   //插入行后面的行號都加1
     {
     p->num = p->num + 1;
     p = p->next;
     }
    break;
   case 2:   //向上移動(dòng)一行
    printf("\t\t輸入要移動(dòng)的字符串所在行號:");
    scanf("%d",&line_num);
    delete1(line_num-1);
    break;
   case 3:   //向右移動(dòng)一列
    printf("\t\t輸人要移動(dòng)的字符串所在行號:");
    scanf("%d", &line_num);
    printf("\t\t輸入要移動(dòng)的字符串所在列號:");
    scanf("%d", &number);
    str[0] = ' ';
    str[1] = '\0';
    insert2(str, line_num, number);
    break;
   case 4:   //向左移動(dòng)
    printf("\t\t輸入要移動(dòng)的字符串所在行號:");
    scanf("%d", &line_num);
    printf("\t\t輸入要移動(dòng)的字符串所在列號:");
    scanf("%d", &number);
    if (number <= 0)
     printf("\t\t該列不存在");
    else
     delete2(line_num, number - 2, 1);
    break;
   case 5:   //退出移動(dòng)
    break;

} 
 
}

//文本內(nèi)容處理菜單
void menu2()
{  
 char str1[20];
 char str2[20];
 int a;
do
{
 HeadWord();
 printf_time();
printf("\n\t\t ____________________________________________________\n");
printf("\t\t|           文章內(nèi)容處理菜單                         |\n");
printf("\t\t|____________________________________________________|\n");
printf("\t\t|---->  1、查找文章中的字符或者字符串                |\n");
printf("\t\t|---->  2、刪除文章中的字符或者字符串                |\n");
printf("\t\t|---->  3、向文章中插入字符或者字符串                |\n");
printf("\t\t|---->  4、移動(dòng)文章字符或字符串                      |\n");
printf("\t\t|---->  5、替換文章字符或字符串                      |\n");
printf("\t\t|---->  6、返回主菜單                                |\n");
printf("\t\t|---->  7、直接退出系統(tǒng)                              |\n");
printf("\t\t|____________________________________________________|\n");
printf("\t\t    請選擇:");
 scanf("%d",&a);
 switch(a)
 {
  case 1:   
          system("cls"); 
         HeadWord();
           findstr();
      printf("\t\t按回車鍵繼續(xù)·····");
    getchar();
       getchar();
    system("cls");
       break;
    case 2:
          system("cls"); 
          HeadWord();
          printf("\t\t|    1:刪除一行文字    2:刪除莫一行,莫列,定長的內(nèi)容|\n\t\t");
          int delete_choice;
             scanf("%d",&delete_choice);
             getchar();
             if(delete_choice == 1)
            {
       int linenum;
       printf("\t\t當(dāng)前文本為:\n");
       PrintWord();
                printf("\t\t請輸入你刪除行的行號:");
          scanf("%d",&linenum);
       getchar(); 
                delete1(linenum);
   }
             else if(delete_choice == 2)
   {
       int linenum, position,lenth;  //行,列,刪除長度 
       printf("\t\t當(dāng)前文本為:\n");
       PrintWord();
          printf("\t\t請輸入要?jiǎng)h除內(nèi)容所在行,列,刪除內(nèi)容字節(jié)長度,中間用空格隔開\n");
       printf("\t\t--->注意:漢字占兩個(gè)字節(jié)\n\t\t");
       scanf("%d %d %d",&linenum,&position,&lenth);
       position = (position*2)-1;
       getchar();
       delete2(linenum,position,lenth);
   }
            printf("\t\t刪除后的文章為:\n");
            PrintWord();
      printf("\t\t按回車鍵繼續(xù)·····");
   getchar();
   getchar();
   system("cls");
      break;
      case 3:
           
         system("cls"); 
         HeadWord();
            printf("\t\t|   1:插入一行文字      2:插入文字到文本到一行的中間|\n\t\t");
            int insert_choice;
            scanf("%d",&insert_choice);
            if(insert_choice == 1)
            {
            printf("\t\t當(dāng)前文本為:\n");
   PrintWord();
   insert1();}
            else
           {
            printf("\t\t當(dāng)前文本為:\n");
   PrintWord();
      char str[MAX]; int linenum; int position;
      printf("\t\t輸入插入位置一行號:");
   scanf("%d", &linenum);
   printf("\t\t輸入插入位置-列號:");
   scanf("%d", &position);
   position = (position*2)-1;
   printf("\t\t要插入的字符串:");
   scanf("%s", str);
   insert2(str,linenum,position);
     }
           
            printf("\t\t插入字符或字符串后文章為:\n");
            PrintWord();
      printf("\t\t按回車鍵繼續(xù)·····");
   getchar();
   getchar();
   system("cls");
      break;
case 4:
      system("cls");
      HeadWord();
   printf_time();
      menu_move();
      printf("\t\t移動(dòng)后文本內(nèi)容為:\n");
   PrintWord();
      printf("\t\t按回車鍵繼續(xù)·····");
   getchar();
   getchar();
   system("cls");
      break;
case 5:
    
      system("cls"); 
      HeadWord();
      printf_time();
      replace();
      printf("\t\t按回車鍵繼續(xù)·····");
   getchar();
   getchar();
   system("cls");
         break;
}
if(a==6)  
{
 system("cls"); 
 break;
}
if(a==7)  exit(0);    
}while(1);        
}

//主菜單

void Mainmenu()
{ 
 printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");
 printf("\n\n\t\t\t   歡迎您使用簡易文本編輯器!\n");
 printf("\n\n\n\n\n\n\n\n\npress Enter to continue...");
 getchar();
 system("cls");
 int t;
 do{
 HeadWord();
 printf_time();
 printf("\n");
 printf("\t\t ____________________________________________________\n");
 printf("\t\t|                 主菜單                             |\n");
 printf("\t\t|                                                    |\n");
 printf("\t\t|---->  1、輸入文章內(nèi)容                              |\n");
 printf("\t\t|---->  2、進(jìn)入文章內(nèi)容處理菜單                      |\n");
 printf("\t\t|---->  3、顯示當(dāng)前文章內(nèi)容                          |\n");
 printf("\t\t|---->  4、保存文本                                  |\n");
 printf("\t\t|---->  5、退出文本編輯器                            |\n");
 printf("\t\t|                                                    |\n");
 printf("\t\t|    注:第一次運(yùn)行本程序時(shí)請選擇功能1               |\n");
 printf("\t\t|____________________________________________________|\n");
 printf("  \t\t  請選擇:");
 scanf("%d",&t);
 if(t>5||t<1)
 {   
  printf("對不起,無此功能,請輸入正確的功能序號!\n");
 }
 else
 switch(t)
 {  
     case 1:  
       system("cls"); 
       HeadWord();
       menu1();
    printf("\t\t按回車鍵繼續(xù)·····");
    getchar();
    getchar();
    system("cls");
             break;
     case 2:  
       system("cls"); 
       menu2();
    break;
  case 3:
       system("cls"); 
       HeadWord();
    printf_time();
    printf("\n\t\t ____________________文章內(nèi)容為______________________\n");
             PrintWord();
    printf("\n");
    printf("\t\t按回車鍵繼續(xù)·····");
    getchar();
    getchar();
    system("cls");
    break;
  case 4:
    HeadWord();
       save();
       break;
    
 }  
 if(t==5) break;
 }while(1);
}

關(guān)于“C語言如何實(shí)現(xiàn)簡易文本編譯器”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI