C语言 实现简单的文本编辑器

本文为大家分享了C语言实现简单的文本编辑器的具体代码,供大家参考。

预期实现三个功能,第一,可以对指定的行输入字符串;第二,删除指定行的字符串;第三,显示编辑器的行数和内容。

我们通过块链结构来实现本程序。“块”的含义是每个块中可以存放多个字符,“链”的含义是块与块之间通过链表结构进行连接。

IDE : Code::Blocks 17.12

Compiler : GNU GCC Compiler

/*块链结构实现简单的文本编辑器*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void Init();  //初始化编辑器
void input();  //对指定的行进行输入,#号结束
void Delline();  //删除指定的行
void List();  //显示文本编辑器的内容
int Menu();  //列出选择菜单并进行选择

//定义存放字符串的节点,块链结构
typedef struct node{
  char data[50];
  struct node *next;
}strnode;
//定义每行头节点
typedef struct head{
  int number;  //行号
  int length;  //字符串的长度
  strnode * next;
}headnode;
//定义有100行
headnode Head[MAX];

//函数Init()实现每行头节点的初始化
void Init(){
  int i;
  for(i=0;i<MAX;++i){
      Head[i].length=0;
  }
}

//函数Menu()实现选择菜单
int Menu(){
  int i;
  i=0;
  printf("-------------\n");
  printf("1. Input\n");
  printf("2. Delete\n");
  printf("3. List\n");
  printf("4. Exit\n");
  printf("-------------\n");
  while(i<=0 || i>4){
      printf("please choose\n");
      scanf("%d",&i);
  }
  return i;
}

//函数input(),向指定行中输入字符串
void input(){
  strnode * p;
  int i,j,LineNum;
  char ch;
  while(1){
      j=-1;
      printf("input the number of line(0~100),101-exit:\n");
      scanf("%d",&LineNum);  //输入要写入的行号
      if(LineNum<0 || LineNum>=MAX){
          return;
      }
      printf("please input,#-end\n");
      i=LineNum;
      Head[i].number=LineNum;
      Head[i].next=(strnode *)malloc(sizeof(strnode));
      p=Head[i].next;
      p->next=NULL;
      ch=getchar();
      while(ch!='#'){
          ++j;
          if(j>=50){ //如果字符串长度超过50,需要再分配一个节点空间
              p->next=(strnode *)malloc(sizeof(strnode));
              p->next->next=NULL;
              p=p->next;  //p指向新分配的节点
          }
          p->data[j%50]=ch;  //将输入的字符放入data中
          ch=getchar();
      }
      Head[i].length=j+1;  //行的长度,以字符为单位
  }
}


//函数Delline()实现对指定行的删除
void Delline(){
  strnode * p,*q;
  int i,LineNum;
  while(1){
      printf("input the number of line which do you want to delete(0~100),101-exit:\n");
      scanf("%d",&LineNum);  //输入要删除的行号
      if(LineNum<0 || LineNum>=MAX){
          return;
      }
      i=LineNum;
      p=Head[i].next;
      if(Head[i].length>0){
          while(p!=NULL){
              q=p->next;
              free(p);
              p=q;
          }
          Head[i].length=0;
          Head[i].number=0;
      }

  }
}


//函数List()将输入的内容显示在屏幕上
void List(){
  strnode *p;
  int i,j,m,n;
  for(i=0;i<MAX;++i){
      if(Head[i].length>0){
          printf("line%d",Head[i].number);
          n=Head[i].length;
          m=1;
          p=Head[i].next;
          for(j=0;j<n;++j){
              if(j>=50*m){  //以50为基准,超过一个则指向下一个节点
                  p=p->next;
                  ++m;  //节点个数
              }else{
                  printf("%c",p->data[j%50]);  //将节点中内容输出
              }
          }
          printf("\n");
      }
  }
  printf("\n");
}

int main()
{
  int sel;
  Init();  //初始化编辑器
  while(1){
      sel=Menu();
      switch(sel){  //对输入的数字进行选择
      case 1:
          input();
          break;
      case 2:
          Delline();
          break;
      case 3:
          List();
          break;
      case 4:
          exit(0);
      }
  }
  return 0;
}

测试运行结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程宝库

数据结构课程设计之简易文本编译器(C语言实现)需求分析(1)具有图形菜单界面:显示实时年份,日期,星期及时间(2)查找:查找文本中的字符串,显示其出现的行数,列数及总共出现次数替换(等长,不等长):对文本中的文本 ...