재귀함수 scanf 질문
글쓴이: kimhyuns55 / 작성시간: 수, 2017/11/22 - 12:14오후
#include <stdio.h> int mystrlen(char arr[]) { int i; for (i=0;arr[i];++i); return i; } int recur(char answer[],char blind[],int chance) { int i, correctCount = 0; char input; if(chance > 0) { printf("chances left [%d] // %s //\n", chance, blind); printf("Guess one character : "); scanf("%c", &input); for(i=0;i<mystrlen(answer);++i) { if(answer[i] == input) { blind[i] = answer[i]; correctCount++; } } } if(correctCount == 0) chance--; if(chance == -1) return 0; else recur(answer, blind, chance); } int main () { int i, chance = 3; char answer[] = "answer", blind[100] = "*****************"; blind[mystrlen(answer)] = 0; recur(answer, blind, chance); }
문자열의 문자를 맞춰나가는 행맨 게임을 작성 중입니다만, int recur 함수에서 두번째로 recur 함수를 다시 부를때, input을 스캔하려 하지 않습니다.
위의 코드를 실행했을 때, 아래와 같은 결과가 나옵니다.
chances left [3] // ****** //
Guess one character : a
chances left [3] // a***** //
Guess one character : chances left [2] // a***** //
Guess one character : n
chances left [2] // an**** //
Guess one character : chances left [1] // an**** //
Guess one character : s
chances left [1] // ans*** //
첫번째 입력은 'a'로 했으며, 글자를 맞추어 chance가 줄어들지 않아야 함에도 불구하고, 다음 recur에서 input을 읽지 않아, chance가 줄어들게 되는것으로 보입니다.
두번째, 세번째 입력또한 각각 정답인 n과 s로 입력하였습니다.
어째서 input을 scan하지 않게 되는지에 대한 답변을 부탁드립니다.
Forums:
처음에 a 를 입력할 때 엔터를 친 것까지 입력
처음에 a 를 입력할 때 엔터를 친 것까지 입력 버퍼에 들어가서 입력 버퍼에 a, \n 순으로 들어가 있는데,
처음 scanf 는 'a'를 읽고 아직 버퍼에 \n 이 남아 있는 상태에서
다음 번 scanf 가 그 \n을 읽어 버려서 그렇습니다.
간단히는 scanf 포맷 문자열을
위와 같이 하면 버퍼의 앞부분의 공백문자들을 저 스페이스가 매칭되며 읽어버리고 %c 에 맞는 입력을 기다리게 됩니다.
아니면 흔한 방법으로 scanf 바로 뒤에 getchar()를 한 번 불러도 되고요.
좋은 하루 되세요!
말씀해 주신대로 수정하니 문제없이 실행됬습니다
말씀해 주신대로 수정하니 문제없이 실행됬습니다
답변 정말 감사합니다!
댓글 달기