더북(TheBook)

10.4 프로젝트.c

int main(void) {
    (중략)
    char line[MAX]; 
    char contents[MAX] = ""; -------------- ➌ 일기장에 입력한 내용을 저장할 변수(빈 값으로 초기화)
    (중략)
    if (strcmp(password, "skehzheld") == 0) { // 비밀번호가 맞았을 때
        (중략)
        printf("\n\n내용을 계속 작성하세요! 종료하려면 EXIT를 입력하세요.\n\n");
        ----------------------------------- ➊ 안내 문구
        while (1) { ----------------------- ➋ 입력이 끝날 때까지
            scanf("%[^\n]", contents);  --- ➍ 줄바꿈 문자(\n) 전까지 한 문장씩 읽어 오기
            getchar(); -------------------- ➎ Enter를 입력해 줄바꿈 문자 플러시 처리
        }
    } else { 
        printf("=== 비밀번호가 틀렸어요. ===\n\n");
    }
    return 0;
}

Note 플러시 처리

서식 지정자 %[^\n]으로 값을 입력받으면 줄바꿈 문자가 나오기 전까지의 문자열을 저장한다고 했습니다. scanf() 함수나 getchar() 함수로 입력받을 때 값은 변수에 저장되기 전에 입력 버퍼란 곳에 임시로 저장됩니다. 그래서 서식 지정자로 %[^\n]을 지정하면 변수에 저장할 때 문자열만 저장하고 줄바꿈 문자는 버퍼에 그대로 있습니다.

예를 들어, 사용자가 ‘일기를 씁니다’라고 입력하고 Enter를 누르면 scanf() 함수는 ‘일기를 씁니다’만 contents 배열에 저장하고 줄바꿈 문자는 버퍼에 그대로 남게 됩니다. 이 상태로 다시 반복하면 버퍼에 이미 줄바꿈 문자가 있기 때문에 다음 내용을 입력받을 수 없습니다. 그래서 Entergetchar() 함수로 입력받은 후 저장하지 않고 버립니다.

이렇게 Enter를 눌러서 입력받은 줄바꿈 문자를 버리는 것을 플러시 처리라고 합니다. 플러시(flush)는 우리말로 ‘씻어 없애다’라는 뜻이므로 버퍼에 남아 있던 줄바꿈 문자를 없애버리는 동작을 나타냅니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.