• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

1번 예제 관련 질문이 있습니다

21.01.09 20:04 작성 조회수 244

5

알파벳이랑 줄 갯수를 scanf()로 입력받아서 해보려고 하는데 코드 순서를 바꿔서 count를 먼저 입력받게 하면 후에 alphabet은 입력받지 않고 넘어가버립니다.(사진의 코드처럼 alphabet을 먼저 입력받으면 정상적으로 실행됩니다)

f11로 한줄씩 실행해봐도 이유를 모르겠습니다

답변 4

·

답변을 작성해보세요.

7

안소님의 프로필

안소

2021.01.10

안녕하세요!

위와 같은 순서로 하면 잘 동작했던 이유를 설명드리겠습니다.

사용자가 콘솔창에 입력하는 모든 것들은 전부 시스템 내부에서 처리되는 '입력 버퍼'라는 곳에 들어가게 됩니다. 사용자가 입력을 다하고나서 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

홍길동님의 프로필

홍길동

2021.02.07

오오 잘 보고 갑니다~!

0

void님의 프로필

void

2021.01.10

답변 많은 도움 받고 갑니다. 

0

harypoteck님의 프로필

harypoteck

질문자

2021.01.10

설명 감사합니다! 이해가 쏙 되네요