인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

luki님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.4강의 질문

해결된 질문

작성

·

100

1

안녕하세요 교수님 요즘 질문을 너무 자주해서 죄송합니다 ㅜㅜ

 

#include <stdio.h>

int main()
{
    int a = 0;
    int count = 0;
    while (1) {
        printf("Current count is %d. Continue? (y/n)\n", count);

        if (getchar() == 'n')
            break;

        while (getchar() != '\n')
            continue;

        count++;
    }



    return 0;
}

여기서 a를 하나만 입력한다고 가정할때,

  if (getchar() == 'n')
      break;

는 조건에 안맞아서 무시하고

        while (getchar() != '\n')
               continue;

여기선 while문안에 continue를 만나서 a는'\n'이 아니니까 while문안에 계속 탈출을 못해서 무한루프에 빠져야 하지않나요?

교수님께선 저 while문으로 인해 버퍼가 초기화 된다고 하신걸로 보아 이전강의에 해당 내용이 있는거 같은데 혹시 어느 강의에 있는지 알수있을까요 ㅜㅜ

답변 2

1

durams님의 프로필 이미지

안녕하세요, 질문&답변 도우미 durams입니다.

본 예제에서 무한루프에 빠지지 않는 이유는 사용자가 입력을 마치기 위해 엔터를 치는 순간 개행문자('\n')도 버퍼에 들어가기 때문입니다. 그 때문에 매번 입력받는 한 줄마다 마지막에는 꼭 '\n'이 있습니다.

입력받은 문자열을 while문에서 한 글자씩 검사할 때, 마지막의 '\n' 부분에 도달하면 조건인 getchar() != '\n'false로 평가되고, while문을 빠져나오게 됩니다.

그리고 getchar()로 버퍼의 문자들을 하나씩 꺼내오기 때문에 버퍼를 비우는 동작까지 같이 수행됩니다.

 

7.2 표준 입출력 함수들 getchar(), putchar() 예제04:35부터 보시면 해당 패턴에 대한 설명이 나옵니다. 영상도 보시고 이 설명글도 천천히 보시면 이해에 문제는 없으실거에요.

 

질문을 자주하는건 전혀 문제되지 않으니 부담없이 여쭤봐주셔도 됩니다. 질문글이 많다는건 오히려 공부를 열심히 하고 계시다는 증거가 되겠네요. 화이팅입니다.

 

luki님의 프로필 이미지
luki
질문자

첫번째로 만나는 getchar는 입력에 쓰이고 그 이후에 쓰이는 getchar는 입력을 안받고 문자를 하나씩 꺼내오는거라고 보면 될까요?

durams님의 프로필 이미지

getchar()는 일관되게 표준 입력 버퍼에서 한 글자씩 꺼내오는 동작입니다. 대신 버퍼가 비어있을 때는 사용자로부터 입력을 받습니다.

본 예제는 한 줄씩 입력받고 입력받은 줄마다 즉시 버퍼를 비워주게 되므로, 아래 부분에서 사용자 입력을 기다리게 되는 것은 맞습니다.

if (getchar() == 'n')
    break;

다만 두 getchar()의 동작을 구별하기보다는, 상황에 따라 이해하시는게 좋습니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. luki님.

귀하의 질문에 답변드리겠습니다. 프로그래밍에서는 버퍼 관리가 중요한 부분입니다. getchar()while (getchar() != '\n')의 작동 방식에 혼란스러워하신 것 같습니다. 여기에서는 getchar() 함수가 입력 버퍼에 남아있는 내용을 하나씩 확인하고 제거하는 역할을 하고 있습니다.

  1. if (getchar() == 'n') 블록:

    • 사용자가 입력한 첫 번째 문자를 검증합니다.
    • 결과가 n이 아니면 break를 건너뛰고 다음 코드를 실행합니다.
  2. while (getchar() != '\n') continue; 블록:

    • 입력 버퍼에 남아있는 문자들이 '\n'이 아닐 때까지 버퍼에서 하나씩 제거합니다.
    • 이는 사용자 입력에 newline('\n')이 도달할 때까지 수행되며, 그 Newline은 사용자가 입력을 완료했음을 의미합니다.

결론적으로, while (getchar() != '\n')는 입력 버퍼를 완전히 비우기 위한 코드이며, 버퍼에 남아있는 다른 문자들을 무시하고 루프로부터 빠져나갈 때까지 반복합니다.

문제의 핵심은, 사용자 입력 후에 버퍼 정리를 해야 다음 입력을 위한 준비가 되는 것을 while (getchar() != '\n')로 구현한 것입니다.

기억이 나지 않지만, 이는 강의의 입출력 버퍼 또는 기본 scanf와 getchar 등의 함수 처리에서 다뤄질 가능성이 있습니다. 여기서 더 자세한 내용을 찾을 수 있을 것입니다.

이와 관련된 비슷한 질문 및 답변을 참고하시기 바랍니다:
- 8.1 입출력 버퍼 강의를 보고 질문드립니다.
- 교수님 버퍼 관련 질문이 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

luki님의 프로필 이미지

작성한 질문수

질문하기