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

saneum3님의 프로필 이미지
saneum3

작성한 질문수

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

8.8 메뉴 만들기 예제

오류가 왜 생기는지 도통 모르겠어요ㅠㅠ

해결된 질문

작성

·

188

0

#include <stdio.h>

#include <stdlib.h>

char get_choice(void);

char get_first_char(void);

int get_integer(void);

void count(void);

int main()

{

int user_choice;

while ((user_choice = get_choice()) != 'q')

{

switch (user_choice)

{

case'a':

printf("Avengers assembel\n");

break;

case'b':

putchar('\a');

break;

case'c':

count(); 

break;

default:

printf("Error with %d.\n", user_choice);

exit(1);

break;

}

}

return 0;

}

char get_choice(void)

{

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

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

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

char c;

while (1)

{

c = get_first_char();

if (c >= 'a' && c <= 'c')

break;

else if (c == 'q')

break;

else

printf("Please try again.\n");

}

return c;

}

char get_first_char(void) 

{

char c;

c = getchar();

while (getchar() != '\n')

continue;

return c;

}

int get_integer(void)

{

int i;

while (scanf("%d", &i) != 1)

{

while (getchar() != '\n') 

continue;

printf("Please try again.\n");

}

return i;

}

void count(void)

{

printf("Enter an integer:\n");

int i = get_integer();

for (int j = 1; j <= i; j++)

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

}

8.8 문제만들기 예제를 푸는데 count()함수를 실행시킬려고

c입력 -> 숫자 입력 -> c입력하면  get choice 함수안에 please try again이 나와요.

제가 원하는건 c입력 -> 숫자 입력-> c입력 ->숫자 입력인데 디버그하고 F10 누르면서 오류 찾을려고 용을 써도 F10누르면 생기는 화살표가 갑자기 없어지더라고요.ㅠㅠㅠㅠ

오류를 스스로 못찾으니 분한마음이 느껴지지만.. 흑흑 부탁드립니다.

답변 2

0

saneum3님의 프로필 이미지
saneum3
질문자

와,, 깔끔하고 친절한 답변 정말 감사드립니다. 정확히 이해 되었어요^^

0

안녕하세요 😀

잘 안되는데 원인을 모르겠으면 너무 분하죠.. 공감합니다ㅠㅠ

우선 디버깅 화살표가 사라지는 이유는 입력 받아야해서 그래요! 예를 들어 1 2 3 4 코드 줄이 있다면 3 번 줄에 브레이크 포인트를 걸었는데 그 이전 줄인 1 번 줄에 scanf 와 같은 입력이 필요한 상태다? 싶으면 화살표가 사라지고 입력이 활성화됩니다. 그 이전 시점에서 입력이 되어 있어야 3번 시점을 알 수 있고 디버깅도 시작할 수 있을테니까요! 먼저 입력부터 하고 디버깅 하라는 의미로 화살표가 사라진다고 보시면 돼요. 화살표가 사라진다면 한번 실행창에서 입력이 깜빡 깜빡하진 않은지 확인해보세요. 입력 하면 다시 원래 브레이크 포인트로 찍었던 코드부터 디버깅이 잘 시작될 것입니다. 화살표 활성화 되구요!

제가 디버깅 해보니까 get_choice 에서 c 가 get_first_char 함수로부터 리턴 받은게 '\n' 개행문자네요. 그래서 Please try again 에 걸린 것입니다. 그 이유는 get_integer 의 scanf 에서 숫자를 입력했을 때 버퍼에 '\n' 개행문자가 남아있어서 그래요!

그런 상태에서 다음 입력의 get_choice 안에서 get_first_char 로 갔을 때  c = getchar(); 를 통해 c 에 개행문자를 저장했기 때문입니다. 그리고 이걸 리턴한거구요. 

즉, 근본적인 원인은 get_integer 에서는 버퍼 비우기를 안해주셔서 그런 것입니다.  scanf 에 입력 실패했을 때만 버퍼 비우도록 코드를 짜셔서요..! 정상적으로 숫자를 입력하여 scanf 가 입력 성공했을 땐 버퍼 비우기가 되지 않아서 개행문자가 다음에 c 에 저장되서 그런 것입니다. 

saneum3님의 프로필 이미지
saneum3

작성한 질문수

질문하기