해결된 질문
작성
·
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입니다.
본 예제에서 무한루프에 빠지지 않는 이유는 사용자가 입력을 마치기 위해 엔터를 치는 순간 개행문자('\n'
)도 버퍼에 들어가기 때문입니다. 그 때문에 매번 입력받는 한 줄마다 마지막에는 꼭 '\n'
이 있습니다.
입력받은 문자열을 while
문에서 한 글자씩 검사할 때, 마지막의 '\n'
부분에 도달하면 조건인 getchar() != '\n'
가 false
로 평가되고, while
문을 빠져나오게 됩니다.
그리고 getchar()
로 버퍼의 문자들을 하나씩 꺼내오기 때문에 버퍼를 비우는 동작까지 같이 수행됩니다.
7.2 표준 입출력 함수들 getchar(), putchar() 예제의 04:35부터 보시면 해당 패턴에 대한 설명이 나옵니다. 영상도 보시고 이 설명글도 천천히 보시면 이해에 문제는 없으실거에요.
질문을 자주하는건 전혀 문제되지 않으니 부담없이 여쭤봐주셔도 됩니다. 질문글이 많다는건 오히려 공부를 열심히 하고 계시다는 증거가 되겠네요. 화이팅입니다.
getchar()
는 일관되게 표준 입력 버퍼에서 한 글자씩 꺼내오는 동작입니다. 대신 버퍼가 비어있을 때는 사용자로부터 입력을 받습니다.
본 예제는 한 줄씩 입력받고 입력받은 줄마다 즉시 버퍼를 비워주게 되므로, 아래 부분에서 사용자 입력을 기다리게 되는 것은 맞습니다.
if (getchar() == 'n')
break;
다만 두 getchar()
의 동작을 구별하기보다는, 상황에 따라 이해하시는게 좋습니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
귀하의 질문에 답변드리겠습니다. 프로그래밍에서는 버퍼 관리가 중요한 부분입니다. getchar()
와 while (getchar() != '\n')
의 작동 방식에 혼란스러워하신 것 같습니다. 여기에서는 getchar()
함수가 입력 버퍼에 남아있는 내용을 하나씩 확인하고 제거하는 역할을 하고 있습니다.
if (getchar() == 'n')
블록:
n
이 아니면 break
를 건너뛰고 다음 코드를 실행합니다.while (getchar() != '\n') continue;
블록:
'\n'
이 아닐 때까지 버퍼에서 하나씩 제거합니다.'\n'
)이 도달할 때까지 수행되며, 그 Newline은 사용자가 입력을 완료했음을 의미합니다.결론적으로, while (getchar() != '\n')
는 입력 버퍼를 완전히 비우기 위한 코드이며, 버퍼에 남아있는 다른 문자들을 무시하고 루프로부터 빠져나갈 때까지 반복합니다.
문제의 핵심은, 사용자 입력 후에 버퍼 정리를 해야 다음 입력을 위한 준비가 되는 것을 while (getchar() != '\n')
로 구현한 것입니다.
기억이 나지 않지만, 이는 강의의 입출력 버퍼 또는 기본 scanf와 getchar 등의 함수 처리에서 다뤄질 가능성이 있습니다. 여기서 더 자세한 내용을 찾을 수 있을 것입니다.
이와 관련된 비슷한 질문 및 답변을 참고하시기 바랍니다:
- 8.1 입출력 버퍼 강의를 보고 질문드립니다.
- 교수님 버퍼 관련 질문이 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
첫번째로 만나는 getchar는 입력에 쓰이고 그 이후에 쓰이는 getchar는 입력을 안받고 문자를 하나씩 꺼내오는거라고 보면 될까요?