//
// 라인 에디터 프로그램
//
#include
#include
#include
#include
#define MAX_CHAR_PER_LINE 1000
#define MAX_CHAR_PER_LINE 1000
#define MAX_NAME 256
void warning(char *);
void error(char *);
#define FALSE 0
#define TRUE 1
typedef struct {
char a[MAX_CHAR_PER_LINE];
} element;
typedef struct ListNode {
element data;
struct ListNode *link;
} ListNode;
typedef struct {
ListNode *head; // 헤드 포인터
int length; // 노드의 개수
} ListType;
//
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node)
{
if (*phead == NULL) { // 공백리스트인 경우
new_node->link = NULL;
*phead = new_node;
}
else if (p == NULL) { // p가 NULL이면 첫번째 노드로 삽입
new_node->link = *phead;
*phead = new_node;
}
else { // p 다음에 삽입
new_node->link = p->link;
p->link = new_node;
}
}
//
void remove_node(ListNode **phead, ListNode *p, ListNode *removed)
{
if (p == NULL)
*phead = (*phead)->link;
else
p->link = removed->link;
free(removed);
}
// 리스트를 초기화한다.
void init(ListType *list)
{
if (list == NULL) return;
list->length = 0;
list->head = NULL;
}
// 리스트안에서 pos 위치의 노드를 반환한다.
ListNode *get_node_at(ListType *list, int pos)
{
int i;
ListNode *tmp_node = list->head;
if (pos < 0) return NULL;
for (i = 0; i tmp_node = tmp_node->link;
return tmp_node; // 현재 노드의 주소값 반환
}
// 리스트의 항목의 개수를 반환한다.
int get_length(ListType *list)
{
return list->length;
}
// 주어진 위치에 데이터를 삽입한다.
void add(ListType *list, int position, element data)
{
ListNode *p;
if ((position >= 0) && (position <= list->length)) {
ListNode*node = (ListNode *)malloc(sizeof(ListNode));
if (node == NULL) error("메모리 할당에러");
node->data = data;
p = get_node_at(list, position - 1); // 주소값이 반환되어짐
insert_node(&(list->head), p, node);
list->length++;
}
}
// 리스트의 끝에 데이터를 삽입한다.
void add_last(ListType *list, element data)
{
add(list, get_length(list), data);
}
// 리스트의 시작에 데이터를 삽입한다.
void add_first(ListType *list, element data)
{
add(list, 0, data);
}
//
int is_empty(ListType *list)
{
if (list->head == NULL) return 1;
else return 0;
}
// 주어진 위치의 데이터를 삭제한다.
void delete(ListType *list, int pos)
{
if (!is_empty(list) && (pos >= 0) && (pos < list->length)) {
ListNode *p = get_node_at(list, pos - 1);
remove_node(&(list->head), p, (p != NULL) ? p->link : NULL);
list->length--;
}
}
//
element get_entry(ListType *list, int pos)
{
ListNode *p;
if (pos >= list->length) error("위치 오류");
p = get_node_at(list, pos);
return p->data;
}
// 전체 삭제하기
void clear(ListType *list)
{
int i;
for (i = 0; ilength; i++)
delete(list, i);
}
// 버퍼의 내용을 출력한다.
void display(ListType *buffer)
{
int i;
ListNode *tmp_node;
tmp_node = buffer->head;
printf("**************\n");
for (i = 0; i < buffer->length; i++) // 현재 입력된 줄의 수 만큼 반복
{
printf("%s", tmp_node);
tmp_node++;
}
printf("\n");
printf("**************\n");
}
//
void warning(char *message)
{
fprintf(stderr, "%s\n", message);
}
//
void error(char *message)
{
fprintf(stderr, "%s\n", message);
exit(1);
}
// 메뉴 호출
void help()
{
printf("**************\n");
printf("i: 입력\n");
printf("d: 삭제\n");
printf("r: 파일읽기\n");
printf("w: 파일쓰기\n");
printf("q: 종료\n");
printf("**************\n");
}
// 디스크 파일로부터 데이터를 읽는다.
void read_file(ListType *buffer)
{
char fname[MAX_NAME];
FILE *fd;
element p;
if (!is_empty(buffer)) {
clear(buffer);
}
init(buffer);
// ** 코드작성 ** //
display(buffer);
}
// 버퍼에 있는 데이터를 디스크 파일에 쓴다.
void write_file(ListType *buffer)
{
FILE *fd;
char fname[MAX_NAME];
element p;
int i;
// ** 코드작성 ** //
display(buffer);
}
// 하나의 라인을 지운다
void delete_line(ListType *buffer)
{
int position;
if (is_empty(buffer))
printf("지울 라인이 없습니다.\n");
else
{
// ** 코드작성 ** //
}
display(buffer);
}
// 하나의 라인을 삽입한다.
void insert_line(ListType *buffer)
{
int position;
char line[MAX_CHAR_PER_LINE];
element p;
printf("입력할 위치 : ");
scanf("%d\n", &position);
fflush(stdin);
fgets(p.a, sizeof(line), stdin);
position = position - 1;
if (get_length(buffer)== 0)
{
add_first(buffer, p);
}
else if (get_length(buffer) == position)
{
add_last(buffer, p);
}
else
{
add(buffer, position, p);
}
display(buffer);
}
// 라인 에디터 각 기능 호출 부분
void do_command(ListType *buffer, char command)
{
switch (command)
{
case 'i': // 입력 기능
insert_line(buffer);
break;
case 'd': // 삭제 기능
/*삭제 함수*/
break;
case 'r': // 파일 읽기
/*읽기 함수*/
break;
case 'w': // 파일 쓰기
/*쓰기 함수*/
break;
case 'q': // 종료
break;
}
}
// 라인 에디터 메인 프로그램
void main()
{
char command;
ListType buffer;
init(&buffer);
do {
help();
command = getchar(); // 명령어 입력받는 부분
do_command(&buffer, command); // 함수 do_command를 통해 기능 선택 및 실행
fflush(stdin);
} while (command != 'q');
}
복붙하는데 겁나 기네ㅋㅋㅋㅋㅋ
일단 한창 작성 중이었고
저 중에서 입력기능 부분 하는 중이었
드디어 구르고 굴러서 처음 입력한 문자열이 어떻게든 나오는건 확인했는데
처음 입력한 첫번째 노드의 문자열은 분명 제대로 뜨는데
그 다음부터 입력시키는 문자열들은 쓰레기값 출력
심지어 계속 하다보면 런타임 에러 뜨는 것 같은데
이 부분만 잡아주실 분.....?
// 라인 에디터 프로그램
//
#include
#include
#include
#include
#define MAX_CHAR_PER_LINE 1000
#define MAX_CHAR_PER_LINE 1000
#define MAX_NAME 256
void warning(char *);
void error(char *);
#define FALSE 0
#define TRUE 1
typedef struct {
char a[MAX_CHAR_PER_LINE];
} element;
typedef struct ListNode {
element data;
struct ListNode *link;
} ListNode;
typedef struct {
ListNode *head; // 헤드 포인터
int length; // 노드의 개수
} ListType;
//
void insert_node(ListNode **phead, ListNode *p, ListNode *new_node)
{
if (*phead == NULL) { // 공백리스트인 경우
new_node->link = NULL;
*phead = new_node;
}
else if (p == NULL) { // p가 NULL이면 첫번째 노드로 삽입
new_node->link = *phead;
*phead = new_node;
}
else { // p 다음에 삽입
new_node->link = p->link;
p->link = new_node;
}
}
//
void remove_node(ListNode **phead, ListNode *p, ListNode *removed)
{
if (p == NULL)
*phead = (*phead)->link;
else
p->link = removed->link;
free(removed);
}
// 리스트를 초기화한다.
void init(ListType *list)
{
if (list == NULL) return;
list->length = 0;
list->head = NULL;
}
// 리스트안에서 pos 위치의 노드를 반환한다.
ListNode *get_node_at(ListType *list, int pos)
{
int i;
ListNode *tmp_node = list->head;
if (pos < 0) return NULL;
for (i = 0; i tmp_node = tmp_node->link;
return tmp_node; // 현재 노드의 주소값 반환
}
// 리스트의 항목의 개수를 반환한다.
int get_length(ListType *list)
{
return list->length;
}
// 주어진 위치에 데이터를 삽입한다.
void add(ListType *list, int position, element data)
{
ListNode *p;
if ((position >= 0) && (position <= list->length)) {
ListNode*node = (ListNode *)malloc(sizeof(ListNode));
if (node == NULL) error("메모리 할당에러");
node->data = data;
p = get_node_at(list, position - 1); // 주소값이 반환되어짐
insert_node(&(list->head), p, node);
list->length++;
}
}
// 리스트의 끝에 데이터를 삽입한다.
void add_last(ListType *list, element data)
{
add(list, get_length(list), data);
}
// 리스트의 시작에 데이터를 삽입한다.
void add_first(ListType *list, element data)
{
add(list, 0, data);
}
//
int is_empty(ListType *list)
{
if (list->head == NULL) return 1;
else return 0;
}
// 주어진 위치의 데이터를 삭제한다.
void delete(ListType *list, int pos)
{
if (!is_empty(list) && (pos >= 0) && (pos < list->length)) {
ListNode *p = get_node_at(list, pos - 1);
remove_node(&(list->head), p, (p != NULL) ? p->link : NULL);
list->length--;
}
}
//
element get_entry(ListType *list, int pos)
{
ListNode *p;
if (pos >= list->length) error("위치 오류");
p = get_node_at(list, pos);
return p->data;
}
// 전체 삭제하기
void clear(ListType *list)
{
int i;
for (i = 0; ilength; i++)
delete(list, i);
}
// 버퍼의 내용을 출력한다.
void display(ListType *buffer)
{
int i;
ListNode *tmp_node;
tmp_node = buffer->head;
printf("**************\n");
for (i = 0; i < buffer->length; i++) // 현재 입력된 줄의 수 만큼 반복
{
printf("%s", tmp_node);
tmp_node++;
}
printf("\n");
printf("**************\n");
}
//
void warning(char *message)
{
fprintf(stderr, "%s\n", message);
}
//
void error(char *message)
{
fprintf(stderr, "%s\n", message);
exit(1);
}
// 메뉴 호출
void help()
{
printf("**************\n");
printf("i: 입력\n");
printf("d: 삭제\n");
printf("r: 파일읽기\n");
printf("w: 파일쓰기\n");
printf("q: 종료\n");
printf("**************\n");
}
// 디스크 파일로부터 데이터를 읽는다.
void read_file(ListType *buffer)
{
char fname[MAX_NAME];
FILE *fd;
element p;
if (!is_empty(buffer)) {
clear(buffer);
}
init(buffer);
// ** 코드작성 ** //
display(buffer);
}
// 버퍼에 있는 데이터를 디스크 파일에 쓴다.
void write_file(ListType *buffer)
{
FILE *fd;
char fname[MAX_NAME];
element p;
int i;
// ** 코드작성 ** //
display(buffer);
}
// 하나의 라인을 지운다
void delete_line(ListType *buffer)
{
int position;
if (is_empty(buffer))
printf("지울 라인이 없습니다.\n");
else
{
// ** 코드작성 ** //
}
display(buffer);
}
// 하나의 라인을 삽입한다.
void insert_line(ListType *buffer)
{
int position;
char line[MAX_CHAR_PER_LINE];
element p;
printf("입력할 위치 : ");
scanf("%d\n", &position);
fflush(stdin);
fgets(p.a, sizeof(line), stdin);
position = position - 1;
if (get_length(buffer)== 0)
{
add_first(buffer, p);
}
else if (get_length(buffer) == position)
{
add_last(buffer, p);
}
else
{
add(buffer, position, p);
}
display(buffer);
}
// 라인 에디터 각 기능 호출 부분
void do_command(ListType *buffer, char command)
{
switch (command)
{
case 'i': // 입력 기능
insert_line(buffer);
break;
case 'd': // 삭제 기능
/*삭제 함수*/
break;
case 'r': // 파일 읽기
/*읽기 함수*/
break;
case 'w': // 파일 쓰기
/*쓰기 함수*/
break;
case 'q': // 종료
break;
}
}
// 라인 에디터 메인 프로그램
void main()
{
char command;
ListType buffer;
init(&buffer);
do {
help();
command = getchar(); // 명령어 입력받는 부분
do_command(&buffer, command); // 함수 do_command를 통해 기능 선택 및 실행
fflush(stdin);
} while (command != 'q');
}
복붙하는데 겁나 기네ㅋㅋㅋㅋㅋ
일단 한창 작성 중이었고
저 중에서 입력기능 부분 하는 중이었
드디어 구르고 굴러서 처음 입력한 문자열이 어떻게든 나오는건 확인했는데
처음 입력한 첫번째 노드의 문자열은 분명 제대로 뜨는데
그 다음부터 입력시키는 문자열들은 쓰레기값 출력
심지어 계속 하다보면 런타임 에러 뜨는 것 같은데
이 부분만 잡아주실 분.....?
- dc official App
댓글 0