입력 확인하기
사용자가 입력한 데이터가 내가 의도한 바와 같은지 확인하는 과정을 예제를 통해 보자.
다시 기억해야 할것. scanf는 argument의 숫자와 동일한 수의 입력이 들어왔을때 그 수를 반환하고, 실패했을때 0을 반환한다.
예제코드를 보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
printf("Please input an integer and press enter. \\n");
long input;
char c;
while (scanf("%ld", &input) != 1)
{
printf("Your input - ");
while ((c = getchar()) != '\\n')
{
putchar(c); // input left in buffer
}
printf(" - is not an integer. Please try again. \\n");
}
printf("Your input %ld is an integer. Thank you. \\n", input);
return 0;
}
여기서
while ((c = getchar()) != '\\n') { putchar(c); // input left in buffer}
부분은 버퍼를 비우고 그전에 입력된 c를 출력하는 역할을 한다.
잘 이해가 안되긴 한다. 어떻게 버퍼를 비우는거지..? 전강의에서 다뤘다는데 충분히 이해가 안됨. 내 생각엔 putchar(c)를 통해 변수 c의 버퍼에 들어간 값을 출력해줌과 동시에 이 값을 비워버린다는 의미인듯. 그리고 실행시켜보면 입력은 문자 입력과 엔터키 입력 두번만에 “~ is not integer~“ string이 출력되는데, getchar()가 scanf()와 동시에 입력을 받고 있는 것인지? 그럼 엔터키 쳐서 들어가는 escape sequence의 입력은 어디로 가는것인지? 이건 그렇다 치고… 아마도 위에서 말한 것 처럼 putchar(c)를 통해 버퍼에 들어간 값을 출력 동시 비워버리는 것이면, 그 값이 엔터가 아닐때만 출력 / 비우는 듯. 이는 엔터만 갈기는 형태를 배제해버리는 기능이고, 입력 값으로 엔터를 배제하는 기능인듯..?
찾아보니 while ((c = getchar()) != '\\n')
이 문장은 아예 버퍼비우기 문장으로 고정되어서 사용되는 듯 함. 일단은 이렇게 이해하고 왜 이게 버퍼비우기 문장으로 사용되는지 getchar()의 작동방식에 대해 더 공부해보자.
아마도? getchar()는 어떻게든 입력된(여기서는 scanf()로 들어온 입력들)값들을 입력버퍼에 넣는 역할을 하는데, 이를 whlie문으로 묶어서 scanf로 들어온 입력들을 한글자씩 받아서 버퍼에 넣는걸 반복하다가, ‘\n’을 만나는 순간 이 행위를 멈추게 될 것이다. 그래서 위의 문장이 버퍼에 ‘\n’이 들어가는걸 방지하는 문장인 듯 하다. 근데 이걸 왜 비우기라고 표현하는지는 잘 모르겠다.
위의 예제코드를 입력된 정수가 1이상, 100이하인지 판별하는 프로그램으로 발전시켜보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
long get_long(void);
int main()
{
long number();
while (1)
{
printf("Please input a integer between 1 and 100 \\n");
long number = get_long();
if (number > 1 && number < 100)
{
printf("OK Thank you.\\n");
break;
}
else
printf("Wrong input try again.\\n");
}
return 0;
}
long get_long(void)
{
printf("Please input an integer and press enter. \\n");
long input;
char c;
while (scanf("%ld", &input) != 1)
{
printf("Your input - ");
while ((c = getchar()) != '\\n')
{
putchar(c); // input left in buffer
}
printf(" - is not an integer. Please try again. \\n");
}
printf("Your input %ld is an integer. Thank you. \\n", input);
return input;
}
위에서 만든 함수를 따로 정의와 바디로 나누고, main함수에는 함수의 반환으로 받은 값을 판단하는 if문만 구현. 두 가지의 기능을 구현하기 위해 두 가지의 scope만드는 아이디어. 그리고 강의 중간에 지나가듯 말했는데, 코드를 보면 main바로 안에 long타입의 number변수를 새로 따로 적었음. while문으로 1에서 100안의 숫자인지 판별하는 문장을 묶어주면서 새로운 스코프가 생기니까. 그 밖에 전역변수? 를 새로 설정한 건지? 이건 다시 알아보자. ****