C 언어 간이 텍스트 편집기 구현
텍스트 편집 소프트웨어 에서 사용자 가 입력 한 모든 텍스트 내용 을 문자열 로 합 니 다.각종 텍스트 편집 소프트웨어 의 기능 은 강약 차이 가 있 지만 기본 동작 은 문자열 의 입력,수정,삭제(전체 줄 삭제 와 한 줄 의 하위 문자열 삭제 포함),검색,출력 등 을 포함한다.분석 을 통 해 시스템 은 다음 과 같은 기능 을 포함해 야 한다.
1.간단 한 텍스트 나 그래 픽 메뉴 인터페이스 가 있 음
2.문자열 이나 텍스트 블록의 찾기,교체,삭제,삽입,이동 작업 을 실현 할 수 있 습 니 다.
3.텍스트 파일 의 메모리 와 읽 기 기능 을 실현 할 수 있 습 니 다.
4.우호 적 인 인터페이스 와 강 한 용 착 력 을 가진다.
디자인 아이디어
1.사용 하 는 논리 구조
텍스트 편집 기 는 주로 텍스트 를 편집 하 는데 텍스트 의 조작 은 문자 에 대한 조작 이다.텍스트 편집 기 는 줄,열 두 방향 으로 편집 할 수 있 습 니 다.
모든 줄 은 하나의 선형 표 로 볼 수 있 고 선형 표 는 선형 구조 이 며 선형 구조의 특징 은 데이터 요소 간 에 선형 관계 이 고 데이터 요소 가'하나씩 배열'하 는 것 이다.하나의 선형 표 에서 데이터 요소 의 유형 은 같다.각 줄 에 저장 할 수 있 는 최대 글자 수 는 같 기 때문에 줄 방향 모든 선형 표 의 최대 길 이 는 똑 같이 설정 할 수 있다.행 과 행 간 의 관계 도 하나의 선형 표 로 볼 수 있다.
2.사용 하 는 저장 구조
선형 표 의 저장 소 는 두 가지 로 나 뉜 다.순서 저장 소 와 체인 저장 소 이다.
순서 저장 이란 메모리 에 주소 로 연속 되 는 저장 공간 순서 로 선형 표를 저장 하 는 각 요 소 를 말 하 는데 이런 저장 형식 으로 저장 되 는 선형 표를 순서 표 라 고 한다.프로 그래 밍 언어 에서 1 차원 배열 이 메모리 에서 차지 하 는 저장 공간 은 연속 적 인 저장 구역 이기 때문에 1 차원 배열 로 순서 표 의 데이터 저장 구역 을 표시 하 는 것 이 가장 적합 하 다.
체인 식 저장 소 는-그룹의 임의의 저장 소 를 통 해 선형 표 의 데이터 요 소 를 저장 하 는 것 이다.데이터 원 계 간 의 선형 관 계 를 구축 하기 위해 모든 데이터 요 소 는 데이터 요소 자체 의 정 보 를 저장 하 는 것 을 제외 하고 그 후계 나 전구 가 있 는 저장 소의 주 소 를 함께 저장 해 야 한다.이 두 부분의 정 보 는 하나의'결점'을 구성 하고 모든 요 소 는 이와 같다.데이터 요소 정 보 를 저장 하 는 것 을 데이터 필드 라 고 하고 전구 나 후계 주 소 를 저장 하 는 것 을 포인터 필드 라 고 합 니 다.하나의 저장 장치 주소 만 있 는 것 은 단일 체인 표 이 고 두 개의 저장 장치 주 소 는 더 블 링크 이다.
실제 기능 수 요 를 고려 하여 각 줄 의 선형 표 는 순서대로 저장 할 수 있 고 모든 문 자 는 하나의 노드 이다.이 줄 이 입력 할 수 있 는 최대 문 자 를 배열 의 길이 로 표시 합 니 다.줄 과 줄 사이 의 선형 표 는 더 블 링크 로 저장 합 니 다.각 노드 는 네 개의 구역 을 포함 하고 하나의 포인터 도 메 인 prior 는 이전 줄 을 가리 키 며 하나의 포인터 도 메 인 next 는 다음 줄 을 가리 키 고 하나의 데이터 도 메 인 num 은 줄 번호 이 며 하나의 데이터 도 메 인 은 본 줄 의 문자 배열 입 니 다.프로그램 은 줄 과 열 로 텍스트 위 치 를 표시 하고 줄 은 양 방향 링크 로 줄 정 보 를 저장 하 며 배열 아래 에 표 시 된 표지 열 정 보 를 사용 하여 문자 위 치 를 정확하게 찾 은 다음 에 검색,교체,삽입,블록 이동,삭제 등 여러 가지 조작 을 할 수 있다.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LEN 100
#define NOT_FOUND -1
// :
struct line
{
char text[MAX_LEN]; //
int num; //
struct line *next; //
struct line *prior; //
};
int lnum;
struct line *start; //
struct line *last; //
struct line *find(int); //
void patchup(int, int); // 1
void delete_text(int); //
void list(); //
void save(); //
void load(); // ,
void insert(char str[], int linenum, int position); //
void printline(int linenum); //
void deletestr(int linenum, int position, int lenth); //
int findstr(char * to_find); //
int menu_select(); //
int menu_select_insert();//
int menu_select_delete();//
int menu_select_print(); //
int menu_select_move(); //
void enter(int linenum); //
void enter_empty(int linenum); //
// , , 、 、 、 。
int main(void)
{
char str[MAX_LEN];
int choice;
int linenum = 1;
int number = 0;
start = NULL;
last = NULL;
load(); // ,
do{
choice = menu_select();
switch (choice)
{
case 1: //
choice = menu_select_insert();//
switch (choice)
{
case 1: //
printf("\t :");
scanf("%d", &linenum);
enter(linenum);
break;
case 2: //
printf(" :");
scanf("%d", &linenum);
printf(" - :");
scanf("%d", &number);
printf(" :");
scanf("%s", str);
insert(str, linenum, number);
break;
case 3: //
break;
}
break;
case 2: //
choice = menu_select_delete(); //
switch (choice)
{
case 1: //
printf("\t :");
scanf("%d", &linenum);
break;
case 2: //
printf(" :");
scanf("%s", str);
number = findstr(str);
if (number == NOT_FOUND)
printf(" ");
else
deletestr(lnum, number, strlen(str));
break;
case 3: //
break;
}
break;
case 3: //
choice = menu_select_print(); //
switch (choice) //
{
case 1:
printf("\t :");
scanf("%d", &linenum);
printline(linenum);
break;
case 2: //
list();
break;
case 3: //
break;
}
break;
case 4: //
printf(" :");
scanf("%s", str);
number = findstr(str);
if (number == NOT_FOUND)
printf(" ");
else
printf(" :%d, :%d
", lnum, number + 1);
break;
case 5: //
printf(" :");
scanf("%s", str);
number = findstr(str);
if (number == NOT_FOUND)
printf(" ");
else
{
deletestr(lnum, number, strlen(str));
printf(" :");
scanf("%s", str);
insert(str, lnum, number + 1);
}
break;
case 6: //
choice = menu_select_move(); //
switch (choice)
{
case 1: //
printf(" :");
scanf("%d", &linenum);
enter_empty(linenum);
break;
case 2: //
printf(" :");
scanf("%d", &linenum);
delete_text(linenum - 1);
break;
case 3: //
printf(" :");
scanf("%d", &linenum);
printf(" :");
scanf("%d", &number);
str[0] = ' ';
str[1] = '\0';
insert(str, linenum, number);
break;
case 4: //
printf(" :");
scanf("%d", &linenum);
printf(" :");
scanf("%d", &number);
if (number <= 0)
printf(" ");
else
deletestr(linenum, number - 2, 1);
break;
case 5: //
break;
}
break;
case 7: //
save();
break;
case 8: //
load();
break;
case 9: //
exit(0);
break;
}
} while (1);
return 0;
}
// ,
int menu_select()
{
int c;
printf("
\t\t1.
");
printf("\t\t2.
");
printf("\t\t3.
");
printf("\t\t4.
");
printf("\t\t5.
");
printf("\t\t6.
");
printf("\t\t7.
");
printf("\t\t8.
");
printf("\t\t9.
");
do
{
printf("
\t\t :");
scanf("%d", &c);
} while (!(c >= 1 && c <= 9));
return(c);
}
// , 。
int menu_select_insert()
{
int c;
printf("
\t\t1.
");
printf("\t\t2.
");
printf("\t\t3.
");
do{
printf("
\t\t :");
scanf("%d", &c);
} while (!(c >= 1 && c <= 3));
return(c);
}
// , 。
int menu_select_delete()
{
int c;
printf("
\t\t1.
");
printf("\t\t2.
");
printf("\t\t3.
");
do{
printf("
\t\t :");
scanf("%d", &c);
} while (!(c >= 1 && c <= 3));
return(c);
}
// ,
int menu_select_print()
{
int c;
printf("
\t\t1.
");
printf("\t\t2.
");
printf("\t\t3.
");
do{
printf("
\t\t :");
scanf("%d", &c);
}while(!(c >= 1 && c <= 3));
return(c);
}
// ,
int menu_select_move()
{
int c;
printf("
\t\t1.
");
printf("\t\t2.
");
printf("\t\t3.
");
printf("\t\t4.
");
printf("\t\t5.
");
do{
printf("
\t\t :");
scanf("%d", &c);
} while (!(c >= 1 && c <= 5));
return(c);
}
// linenum 。
void enter(int 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(" ");
}
else // ,
{
info = (struct line *)malloc(sizeof(struct line));
printf(" ");
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;
}
}
}
// ,
// 1, , 1.
void patchup(int n, int incr)
{
struct line *i;
i = find(n);
i = i->next;
while (i)
{
i->num = i->num + incr;
i = i->next;
}
}
// 。
void enter_empty(int linenum)
{
struct line *info, *p;
info = (struct line *)malloc(sizeof(struct line));
if (!info)
{
printf("\t! !
");
exit(0);
}
info->text[0] = ' ';
info->text[1] = '\0';
info->num = linenum;
if (find(linenum)) // ,
{
p = start;
if (linenum == 1) //
{
info->next = p;
start = info;
info->prior = NULL;
p->prior = info;
}
else //
{
while (p->next->num != linenum)
p = p->next;
info->next = p->next;
p->next->prior = info;
p->next = info;
info->prior = p;
}
patchup(linenum, 1);
}
else
printf(" ");
}
// 。 ,
void insert(char str[], int linenum, int position)
{
struct line * info;
int len, i;
int lenth;
char rest_str[MAX_LEN], nostr[2] = { " " };
info = start;
while (info && info->num != linenum) //
{
info = info->next;
}
if (info == NULL)
printf(" !
");
else if (position < 0)
printf(" !
");
else // ,
{
lenth = strlen(info->text);
if (lenth < position) //
{
len = position - lenth - 1;
for (i = 0; i < len; i++)
strcat(info->text, nostr); //
strcat(info->text, str); //
}
else //
{
strcpy(rest_str, &info->text[position - 1]);
strcpy(&info->text[position - 1], str);
strcat(info->text, rest_str);
}
}
}
// 、 、 lenth 。
void deletestr(int linenum, int position, int lenth)
{
struct line * info;
char rest_str[MAX_LEN];
info = find(linenum);
if (info == NULL)
printf(" !n");
else
{
if (strlen(info->text) <= (position + lenth)) // <= + , '\0'
info->text[position] = '\0';
else
{
strcpy(rest_str, &info->text[position + lenth]);
strcpy(&info->text[position], rest_str);
}
}
}
// lineup 。
void delete_text(int linenum)
{
struct line * info, *p;
info = start;
while ((info->num < linenum) && info)
info = info->next;
if (info->next == NULL)
printf(" ");
else
{
p = info->next;
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;
}
}
}
// 。
int findstr(char * to_find)
{
struct line * info;
int i = 0, find_len, found = 0, position;
char substring[MAX_LEN];
info = start;
lnum = 0; //
find_len = strlen(to_find);
while (info && !found) //
{
i = 0; //
while (!found && (i <= strlen(info->text) - find_len)) //
{
strcpy(substring, &info->text[i], find_len);
substring[find_len] = '\0';
if (strcmp(substring, to_find) == 0)
{
found = 1;
lnum = info->num;
}
else
++i;
}
info = info->next;
}
if (found) //
position = i;
else //
position = NOT_FOUND;
return(position);
}
// , 。
struct line * find(int linenum)
{
struct line * info;
info = start;
while (info)
{
if (linenum != info->num)
info = info->next;
else
break;
}
return (info);
}
//
void printline(int linenum)
{
struct line *info;
info = find(linenum);
if (info)
printf("%d:%s
", info->num, info->text);
else
printf(" ");
}
//
void list()
{
struct line * info;
info = start;
while (info)
{
printf("%d:%s
", info->num, info->text);
info = info->next;
}
printf("
");
}
//
void save()
{
struct line * info;
char * p;
FILE * fp;
if ((fp = fopen("D:\\text.txt", "w")) == NULL){
printf("\t !n");
exit(0);
}
printf("\t !
");
info = start;
while (info)
{
p = info->text;
while (*p)
putc(*p++, fp);
putc('
', fp);
info = info->next;
}
fclose(fp);
}
// 。
void load()
{
struct line *info, *temp; //info ,temp info
char c;
FILE *fp; //
int inct, i; //
temp = NULL;
if ((fp = fopen("D:\\text.txt", "r")) == NULL)
{
printf("\t !
");
exit(0);
}
printf("
\t !
");
start = (struct line*)malloc(sizeof(struct line)); //
info = start;
inct = 1;
while ((c = fgetc(fp)) != EOF)
{
i = 0;
info->text[i] = c;
i++;
while ((c = fgetc(fp)) != '
') // ,
{
info->text[i] = c;
i++;
}
info->text[i] = '\0'; //
info->num = inct++; // 1
info->next = (struct line*)malloc(sizeof(struct line));
if (!info->next)
{
printf("
\t !");
exit(0);
}
info->prior = temp;
temp = info;
info = info->next;
}
temp->next = NULL;
last = temp;
free(info);
start->prior = NULL;
fclose(fp);
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.