인프런 커뮤니티 질문&답변

skadygks8601님의 프로필 이미지
skadygks8601

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.8 메뉴 만들기 예제

메뉴가 두 개씩 떠요

작성

·

75

1

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

int main()

{

int n, i;

char c;

while (1)

{

printf("Enter the leter of your choice: \n");

printf("a. avengers\tb. beep\n");

printf("c. count\tq. quit\n");

scanf("%c", &c);

if (c == 'a')

printf("Avengers assemble!\n");

else if (c == 'b')

printf("\a");

else if (c == 'c')

{

printf("Enter an integer: ");

scanf("%d", &n);

for (i = 1; i <= n; i++)

{

printf("%d\n", i);

}

}

else if (c == 'q')

break;

}

return 0;

}

답변 1

1

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

해당 강의의 초반 예제 문제에 대한 내용이시군요.

스스로 구현하려 노력하신 부분이 멋있게 보여서, 조심스레 칭찬을 드리고 싶네요.

우선, 문제의 원인은 scanf() 함수가 문자 입력 후 버퍼에 남아있는 개행 문자(`\n`)를 처리하지 않기 때문입니다. 사용자 입력을 완료할 때, 엔터 키를 눌러 개행 문자를 추가로 입력한다는 부분을 생각해보시면 이해에 도움이 되실 것 같습니다.

 

이와 관련하여서는, 지금까지의 강의에서의 '버퍼 비우기' 에 대한 교수님의 설명을 떠올려보시면 도움이 되실 것 같습니다.

만약, 어려우시다면 해당 강의 9:29 부분의 char get_first_char(void) 함수에 대한 교수님의 설명과 해당 부분에서 열어진 코드 파일의 73 ~ 74 라인의 코드 while (getchar() != '\n') continue; 부분을 참고해보시면 좋을 것 같습니다.

 

질문자님께서 제공해주신 코드에 단순히 버퍼를 비우는 코드만 추가하여, 의도대로 동작하는 코드를 첨부드립니다.
한 번, 위 내용을 참고하시어 스스로 구현을 진행해보신 후에, 비교 및 참고만 해보시는 정도로 살펴보시면 도움이 되실 것 같습니다.

 

#define CRTSECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
  int n, i;

  char c;

  while (1)
  {
    printf("Enter the leter of your choice: \n");

    printf("a. avengers\tb. beep\n");
    
    printf("c. count\tq. quit\n");

    scanf("%c", &c);
    while (getchar() != '\n')
      continue ;

    if (c == 'a')
      printf("Avengers assemble!\n");
    else if (c == 'b')
      printf("\a");
    else if (c == 'c')
    {
      printf("Enter an integer: ");

      scanf("%d", &n);

      for (i = 1; i <= n; i++)
      {
        printf("%d\n", i);
      }
    }
    else if (c == 'q')
      break;
  }

  return 0;
}

 

 

skadygks8601님의 프로필 이미지
skadygks8601

작성한 질문수

질문하기