작성
·
1.2K
2
위와 같은 코드를 실행하였을 때,
콘솔창에서 입력을 할 때 엔터를 누를 때 마다 엔터 전의 문자들이 출력이 됩니다.
엔터도 그냥 문자 '\n' 으로 인식해서
다음 줄에서 입력을 계속 할 수 있을 것으로 생각했는데 왜 그런 건가요?!
답변 6
7
네 맞습니다. 사용자가 엔터를 치면 그때서야 콘솔창에 입력한 모든 것들이 차례로 입력 버퍼에 저장이 됩니다.
scanf와 getchar는 이 입력 버퍼에서 값을 가져와서 저장하거나 리턴하는것 뿐입니다. 이런식으로 작동이 되요.
6번째 루프까지는 getchar가 H e l l o \n 모두 읽어 온 상태일테니 입력버퍼에서 읽어 올게 아무것도 없죠.
그러니 7 번째 루프부터 다시 콘솔 입력이 활성화 되는 것입니다.
scanf가 2번 있으면 콘솔창 입력을 2번 받아야한다고 생각하기 쉽지만,
위와 같이 첫번쨰 scanf에서 asd asds 이렇게 입력하고 엔터를 쳤더니 두 번쨰 scanf에선 콘솔 입력을 활성화 하지 않은 채 바로 b에 s가 입력된 것을 확인할 수 있습니다.
입력 버퍼에 a s d 공백 a s d s \n 이렇게 들어가 있기 때문에 첫번째 scanf와 두번쨰 scanf에서 앞에 있는 a와 s를 뺴와서 저장했기 때문입니다. 입력 버퍼에서 빼올 것이 있기 때문에 굳이 두 번째 scanf에서 콘솔 입력이 활성화 되지 않았던 것이죠.
2
1. 기본적으로 getchar()나 scnaf는 시스템 내부의 입력 버퍼에 있는 문자들로부터 입력을 받습니다. 콘솔창에 입력하는 모든 문자들이 사용자가 엔터를 치는 순간 모두 입력 버퍼에 들어가게 되어요. 우리가 콘솔창에 입력한 후 엔터를 쳐야만 이제부터 그 입력한 것들을 바탕으로 다음 로직이 시작되죠.
2. 입력 버퍼로부터 더 이상 가져올게 없을 때 콘솔 입력이 활성화됩니다.
예를 들어 콘솔창에 'Hello'를 입력하고 엔터를 딱치게되는 순간 시스템 내부의 입력 버퍼에 'H' 'e' 'l' 'l' 'o' '\n' 이렇게 들어가게 됩니다. 개행문자까지도 들어가요. 이 입력 버퍼에서 getchar()와 scanf()가 입력할 문자를 읽어들여 받아오는 것입니다. 읽어들인 그 문자는 입력 버퍼에서 비워집니다. getchar()가 순서대로 'H' 👉 'e' 👉 'l' 👉 'l' 👉 'o' 👉 '\n' 이렇게 ch 에 리턴하게 될겁니다. while문 반복 한번마다 리턴하니 6번의 while문 반복을 거치게 되겠네요. 그래서 putchar는 이 ch를 출력하므로 'H' 👉 'e' 👉 'l' 👉 'l' 👉 'o' 👉 '\n' 이렇게 출력하게 될겁니다. 근데 입력버퍼에 '.' 가 있어야하고 이를 getchar()가 읽어 올 때 반복문이 종료되어야 하죠. 아직 '.'가 나온건 아닌데 입력버퍼는 비워져 더 이상 가져올 문자가 없으니 이제 새롭게 입력을 다시 받아야합니다. 그래서 입력했던 문자열인 Hello가 출력되고 개행문자까지 출력이 됩니다. 그리고 개행문자 출력으로 인해 "다음 줄"에서 새로운 콘솔 입력이 활성화되는 것입니다.
위와 같은 원리라는 것을 생각해주세요!
while문 안에서의 getchar()가 어떻게 작동 되는지는 https://www.inflearn.com/questions/100574 이 링크도 한번 확인해주세요
1
0
답변 감사드립니다!
그렇다면 getchar() 는
입력 버퍼에 저장되어 있는 것을 일단 차례로 리턴하고,
더이상 리턴할게 없을 때 부터 새로 입력을 받게 되는 건가요?
즉. 입력 버퍼에 값이 있을때와 없을때 기능이 달라지는 걸까요?!
while (( ch = getchar() ) != '.') 에서,
Hello\n 를 입력한다면,
6번은 순서대로 입력버퍼에서 받아오고,
같은 함수의 실행인데도 7번째 루프에서는 또 새로 입력이 되는 개념이 조금 이해가 안갑니다!
입력 버퍼에 값이 있을때에는 리턴 - 대입 기능만 되고,
값이 없을때에만 콘솔 입력 기능이 활성화 되는건가요?!?
0
0