• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

8.8 질문있습니다

23.03.07 16:30 작성 조회수 220

2

밑 부분 getfirstchar 함수부분 질문입니다.

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

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

윗 부분이 제가 한 것이고 밑 부분이 정답인데 제 것을 복사해서 정답예제에 바꿔 넣어서 하니 넘어가지 않고 try again부분이 계속 반복됩니다

이 부분이 문제가 있는건 맞는데 왜 문제가 생기는지 정확하게 모르겠어요 ㅜㅜ

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.08

안녕하세요, 답변 도우미 Soobak 입니다.

또 뵙네요, 반가워요.

먼저, 질문자님의 코드와 강의에서의 코드에 대하여 큰 차이점을 설명드리고,
이후 조금 더 자세히 설명드리는 방식으로 답변드려보겠습니다.

1. 질문자님의 코드

char get_first_char(void)
{
  int ch;

  while((ch = getchar()) != '\n')
    continue;
  
  return ch;
}  
  • 해당 코드에서 getchar() 함수가 호출되는 과정을 한 번 디버거 등으로 따라가 보셔요!

  • 위 코드에서는 getchar() 함수를 호출만 하는 것이 아니라, 호출 후 읽어드린 문자를 "조건에 맞는 한 계속해서" ch 변수에 할당을 하고 있습니다.

  • 디버거를 사용해서 어떤 값이 반환되는 지 눈으로 확인해보시면 어떤 점이 함수의 의도와 다르게 구현된 것인지 확인하실 수 있을거에요!

2. 강의에서의 코드

char get_first_char(void)
{
  int ch;

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

  return ch;
}
  • 강의에서 코드는 함수의 의도에 해당하는 "첫 번째 문자를 읽기 위해" ch 변수에 getchar() 함수를 호출하여 할당하고 있습니다.

  • 이후 while() 문 안에서의 getchar() 함수는 호출을 하지만, 변수에 할당하는 과정이 없습니다.

  • 따라서, 첫 번째 문자 이후의 문자들을 "읽어오기는 하되, 반환하려는 변수에 할당하지는 않습니다."

이제 조금 힌트를 얻으셨을 것 같은데요.
while() 문 안에서 getchar() 함수를 호출하는 것, 특히, 변수에 할당하는 과정 없이 getchar() 함수만을 반복적으로 호출하는 패턴은 지금까지 강의에서 정말 여러번 다루셨을 거에요!

질문자님께서 질문을 주신 8.8 메뉴 만들기 예제 강의에서도 마찬가지로, 8:47 부분 경 똑같은 패턴이 나타납니다. 이 때는 버퍼를 비우기 위한 의도로 while() 문 안에서 getchar() 함수를 호출하는 것이지요.
해당 강의 뿐만 아니라, 지금까지 여러 강의에서 이러한 패턴을 보신 적이 있으실 거에요! 혹시 익숙하지 않으시다면 이전 강의들에서 해당 패턴을 사용하는 부분만 탐색하며 조금씩 복습해보시는 것도 추천드립니다. 강의에서 아주 자주 쓰이는 패턴이니까요.

구현하시려는 get_first_char() 함수는 강의 중 get_choice() 함수 부분에서 사용됩니다. 질문해주신 강의 11:50 부분입니다.
여기서, 함수의 이름에서 나타나듯 get_first_char() 함수는 읽어드린 인풋에서 "첫 번째 문자" 를 반환하는 역할을 수행합니다.
따라서, 첫 번째 문자 이외의 다른 문자들은 함수의 의도에 비추어 보았을 때 무의미한 문자이므로, 해당 문자들을 없애주는 용도로 while() 문을 통해 "변수에 할당하는 과정 없이" 읽어오는 것 입니다.

요약해보면 다음과 같습니다.

  • 질문자님의 코드의 경우 함수의 의도에 맞게 "첫 번째 문자" 만을 읽고 반환 변수에 할당하는 것 뿐만 아니라, while() 반복 문 안에서 계속해서 반환 변수에 할당하는 로직이 존재하여, 정작 반환되는 값은 첫 번째 문자가 아니게 될 수도 있다. (만약, 한 글자의 인풋이 들어왔다면 상관이 없겠죠, 이렇게 다양한 경우를 계속 생각하며 공부하시면 학습으로 얻어가는 것이 굉장히 많아지는 것 같아요!)

만족스러운 답변이 되셨길 바라며, 질문해주셔서 감사하고 또 궁금하신 점 있으시다면 편하게 댓글 남겨주세요. 감사합니다. :) 화이팅!

아, 추가적으로 혹시 아직 디버거의 사용이 익숙하지 않으시다면, 처음에만 좀 낯설을 뿐이지 익숙해지면 굉장히 굉장히 편리한 도구이므로 한 번 디버거의 사용에 익숙해져보시는 것도 추천드립니다!!

감사합니다. 화이팅 화이팅!!!!

Organ님의 프로필

Organ

질문자

2023.03.08

감사합니다!!