더북(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)는 우리말로 ‘씻어 없애다’라는 뜻이므로 버퍼에 남아 있던 줄바꿈 문자를 없애버리는 동작을 나타냅니다.