해결된 질문
작성
·
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
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 에 저장되서 그런 것입니다.