24.02.05 TIL

lsjoon·2024년 2월 5일
0

TIL

목록 보기
25/51

개념 정리

C - 열거형 (Enum)

OTHER

C - Linked List 구현

COMMENT

RBTree 구현 전, C에 익숙해지기 위해 Linked List 를 C로 구현하였다.
연결리스트의 동작 방식에 대한 복습 후, 기본적인 insertion, deletion, search, print, clearMemory 등은 인터넷의 소스 코드를 참조했다. 그 후 사용자가 원할 때까지 명령을 반복적으로 입력받을 수 있도록 무한루프 및 switch 를 사용하여 스스로 코드를 보완했다.

값의 크기를 비교해가며 삽입과정에서 정렬이 되도록 할지 고민했는데, 그 부분은 차후 이진 트리에서 구현하기로 결정했다. insert 는 연결리스트의 마지막에 계속 삽입되고, delete 는 연결리스트의 헤더와 가까운 값이 가장 먼저 삭제된다.

예외처리 같은 경우 맨 처음엔 각 기능별로 함수를 모두 정의하였으므로 함수 내에서 처리하였으나, 삭제 , 검색 , 출력 은 모두 리스트에 값이 존재할 때에만 가능하기 때문에 command 값을 확인 후 위 3개 종류는 조건문 처리를 통해 Head Node 가 NULL 이 아닐 때에만 해당 switch 구문으로 이동하도록 했다.

가장 심각한 오류는, 명령(정수형) 입력시 '방향키'를 오입력하게 되면, printf 함수들이 무한 출력되는 현상이었다. 옆의 RBTree 를 이미 구현한,, 동기에게 물었으나 터미널 문제라는 답만을 확인할 수 있었고, 결국 챗 GPT 를 통해 답을 얻을 수 있었다.

scanf 를 통해 입력받은 값이 올바른지 검증하는 부분이 없어 발생한 문제였고, 해결 방법은 두 가지였다.
첫번째로 'scanf' 의 리턴값을 검증한 뒤 사용자가 올바른 값을 입력할 때까지 반복하는 방법이 있다.
두번째로 'scanf' 의 리턴값을 정수형 (%d) 이 아닌 문자열 (%s) 로 받은 뒤 이를 분석하여 유효한 명령인지 확인하는 방법이다.

나는 전자를 택하여 코드를 수정했고, 다음은 오류처리 과정이다.


  • 수정 전

코드

for (;;) {
  printf("명령을 입력해주세요: ");
  // 입력값에 대한 검증 X
  scanf("%d", &command);

터미널


loop ...ing


  • 수정 후

코드

for (;;) {
  printf("명령을 입력해주세요: ");

  // 입력에 대한 검증 후, 올바른 입력이 들어올 때까지 반복
  while (scanf("%d", &command) != 1) {
      printf(">>>>> 잘못된 입력입니다. 다시 입력해주세요. <<<<<\n");
      while (getchar() != '\n'); // 버퍼 비우기
      printf("명령을 입력해주세요: ");
  }

터미널

profile
중요한 것은 꺾여도 그냥 하는 마음

0개의 댓글