해결된 질문
작성
·
376
5
알파벳이랑 줄 갯수를 scanf()로 입력받아서 해보려고 하는데 코드 순서를 바꿔서 count를 먼저 입력받게 하면 후에 alphabet은 입력받지 않고 넘어가버립니다.(사진의 코드처럼 alphabet을 먼저 입력받으면 정상적으로 실행됩니다)
f11로 한줄씩 실행해봐도 이유를 모르겠습니다
답변 4
7
안녕하세요!
위와 같은 순서로 하면 잘 동작했던 이유를 설명드리겠습니다.
사용자가 콘솔창에 입력하는 모든 것들은 전부 시스템 내부에서 처리되는 '입력 버퍼'라는 곳에 들어가게 됩니다. 사용자가 입력을 다하고나서 Enter키를 누르게 되니까 그 개행 문자 '\n' 까지도 입력 버퍼 안에 들어가게 되어요. 그리고 scanf같은 입력 함수는 이 입력 버퍼로부터 값을 꺼내와서 변수에 저장하는 식으로 작동을 합니다.
위의 예시로 보자면 첫번째 입력에서 c 를 입력하고 엔터를 치게 되잖아요? 그러면 이 입력 버퍼는 'c'와 '\n' 가 들어가게 됩니다. 마치 입력버퍼는 대기 줄과도 같아서 가장 먼저 들어간 것이 가장 앞에 있게 되므로 'c'부터 빠져나오게 될거에요.
첫 번째 scanf 👉 alphabet은 char 타입의 변수이기 때문에 현재 입력 버퍼 맨 앞에 있는 'c'를 받을 수 있습니다. 그래서 'c'가 alphabet 변수에 저장이 되고 동시에 입력 버퍼에서 'c'가 사라지게 됩니다. 그리고 입력 버퍼에는 '\n'만 남아있게 됩니다.
두 번째 scanf 👉 count는 int 타입의 변수이기 때문에 현재 입력 버퍼 맨 앞에 있는 '\n' 개행 문자를 int에 받을 수 없습니다. '\n'는 문자이기 때문이에요! 그래서 "%d" 정수로 입력 받으려는 이 두 번째 scanf는 입력 버퍼에 있는 '\n'을 무시하게 됩니다. 그럼 더 이상 입력 버퍼에서 가져올게 없죠! 그래서 새롭게 사용자 입력을 받게 됩니다. 그래서 저렇게 5 를 입력할 수 있었던거구요! 5를 입력하면 성공적으로 count 에 입력이 되게 됩니다.
위와 같은 순서로 하면 alphabet은 입력 받지 않고 넘어갔던 이유를 설명드리겠습니다.
위의 예시로 보자면 첫번째 입력에서 5 를 입력하고 엔터를 치게 되므로 이 입력 버퍼에는 5와 '\n' 가 들어가게 됩니다.
두 번째 scanf 👉 첫 번째 scanf를 통해 5가 count 변수에 잘 입력이 되었고 현재 입력 버퍼에는 '\n' 만 남아있는 상태일 것입니다. 근데 두 번째 scanf는 "%c" 즉 char 문자를 입력 받는 scanf입니다. 그래서 '\n'을 받을 수 있게 되어요!!! 그래서 사용자의 입력을 새롭게 받을 필요 없이 입력 버퍼에 있는 '\n'가 이 alphabet 변수에 저장이 되어버린 것입니다. '\n'도 엄연한 문자이기 때문이에요. 5를 입력하고 엔터쳤을때의 그 엔터가 alphabet 에 들어가게 된거에요! 그래서 alphabet 사용자 입력을 받지 않았고 alphabet = ' \n' 로 처리되어 저런 결과가 나온 것입니다.
그래서 이렇게 정수를 입력하고나서 뒤이어 char 문자를 입력 받으려고 시도한다면, char 문자에 엔터문자인 '\n'나 혹은 공백문자 같은 것도 들어갈 수 있기 때문에 입력 버퍼를 비워주는 행위를 앞서 꼭 해주어야 합니다. 입력 버퍼 상태는 디버깅으로 내부를 확인할 수가 없기 때문에 C언어에서 입력을 다룰 땐 개발자가 이런 부분을 잘 숙지하셔야 하는 것 같아요! 이 부분에 대해서는 뒤에 가서 자세히 배우실겁니다 ㅎㅎ
0
0
0