3-2-나.scanf

프로그램은 혼자 실행되는 것이 아니라 보통 사용자와 상호 작용한다. 어떤 특정한 동작을 하려면 사용자로부터 명령을 받아 들이거나 동작에 필요한 기본적인 정보를 입력받아야 한다. 예를 들어 바이오 리듬 프로그램을 작성한다면 생년월일과 조사하고 싶은 날짜를 사용자에게 물어 보아야 할 것이고 성적 관리 프로그램이라면 관리의 대상이 되는 성적을 입력받아야 할 것이다.

scanf(스캔에프라고 읽는다)는 사용자로부터 정보를 입력받는 기본 함수이다. printf의 반대 함수이며 동일한 서식을 사용한다. 즉 정수를 입력받고 싶으면 %d 서식을 사용하고 문자열을 입력받고 싶으면 %s 서식을 사용하면 된다. 단 실수 서식인 %f가 printf는 float, double에 모두 대응되는데 비해 scanf는 float와만 대응된다는 점만 다르다. scanf로 double값을 입력받으려면 %lf 서식을 사용해야 한다. scanf를 호출하면 화면에 커서가 나타나 깜박거리며 입력을 요구하는데 이 상태에서 사용자는 키보드를 통해 프로그램이 요구하는 정보를 입력하고 Enter키를 누르면 된다. 기본 형식은 다음과 같다.

 

scanf("서식문자열", &변수 [,&변수, ...]);

 

printf 와는 달리 서식 문자열에는 오로지 서식만 들어갈 수 있으며 서식 이외의 문자열은 넣어 봐야 무시된다. 입력받고자 하는 정보를 사용자에게 요구할 때는 scanf이전에 printf로 미리 어떤 정보를 입력하라는 안내 문자열(프롬프트라고 한다)을 출력해야 한다. 앞장에서 작성한 숫자 맞추기 게임의 소스를 보면 scanf의 사용예가 있다.

 

printf("숫자를 입력하세요(끝낼 때는 999) : ");

scanf("%d",&input);

 

printf 함수로 미리 어떤 값을 입력해 달라는 메시지를 출력하였다. 이때 개행 코드(\n)를 출력하지 않아야 메시지 바로 다음 위치에서 입력을 받을 수 있다. 서식 문자열로 %d를 주어 정수값 하나를 입력받는다는 것을 표시했으며 이 값을 input이라는 변수에 대입하도록 했다. 문자를 입력받는다면 %c, 실수는 %f, 문자열은 %s 서식을 사용하면 된다.

이때 scanf로 입력받을 변수를 지정할 때 변수명앞에 & 연산자를 붙여야 한다. 이유는 변수의 값이 아닌 번지를 전달해야 scanf가 이 변수의 값을 변경할 수 있기 때문이다. 무척 복잡하게 들리겠지만 &연산자는 한참 후에나 살펴볼 수 있는 어려운 연산자이기 때문에 일단은 이해가 가지 않더라도 scanf로 값을 입력받을 때는 & 연산자를 변수명앞에 붙여야 한다는 것을 외워 버리도록 하자.

정수형 변수 a에 값을 입력받으려면 scanf("%d", &a), 실수형 변수 b에 값을 입력받으려면 scanf("%f", &b) 라고 호출하면 된다. 문자열의 경우는 입력받는 방법이 조금 다른데 아직 문자열 표현 방법을 배우지 않았으므로 다음에 기회가 될 때 설명하도록 하자. 다음 예제는 입출력 실습을 위한 예제이다. 두 개의 정수를 사용자로부터 입력받아 그 합을 출력한다.

 

: scanf

#include <Turboc.h>

 

void main()

{

     int a,b;

     int sum;

 

     printf("첫 번째 숫자를 입력하세요 : ");

     scanf("%d",&a);

     printf("두 번째 숫자를 입력하세요 : ");

     scanf("%d",&b);

     sum=a+b;

     printf("입력한 두 수의 합은 %d입니다.\n",sum);

}

 

printf로 어떤 수를 입력하라는 안내 메시지를 먼저 출력하고 scanf로 정수값을 입력받아 a, b 변수에 저장했다. sum에 두 수의 합을 구하고 printf로 그 합을 출력하면 된다. 실행 결과는 다음과 같다.

 

첫 번째 숫자를 입력하세요 : 26

두 번째 숫자를 입력하세요 : 32

입력한 두 수의 합은 58입니다.

 

printf가 한꺼번에 여러 개의 변수를 출력할 수 있듯이 scanf도 여러 개의 변수를 한꺼번에 입력받을 수 있다. 서식 문자열에 여러 개의 서식을 작성하고 뒤쪽에 입력받을 변수도 서식 개수만큼 나열하면 된다. 다음 코드는 scanf 를 한 번 호출하여 두 개의 정수를 입력받는다.

 

printf("두 개의 숫자를 입력하세요 : ");

scanf("%d%d",&a,&b);

 

사용자는 두 정수를 공백, 개행 코드 등으로 분리해서 입력한다. printf와 마찬가지로 %와 서식 사이에 입력 형식을 지정하는 다양한 양식도 사용할 수 있다. 별로 어렵지는 않지만 여기서는 이런 것들에 대해서 굳이 설명하지 않고자 한다. 지금은 그래픽 환경의 윈도우즈 시대이고 그래픽 환경에서는 값을 입력하거나 선택하는 다양한 컨트롤들이 제공된다. 다음은 값을 입력받는 대화상자의 한 예이다.

입력받고자 하는 값의 성격에 따라 적합한 컨트롤들을 사용할 수 있으므로 훨씬 더 직관적이고 사용하기도 쉽다. 뿐만 아니라 scanf는 질문과 답변 형태로 값을 입력받지만 대화상자는 순서에 상관없이 입력할 수 있고 확인 버튼을 누르기 전에 마음대로 수정할 수도 있다. 키보드로 값을 타이프해서 입력하는 시대는 한참 전에 지났으며 그래서 도스용 프로그램을 작성하지 않는 한 scanf 함수로 값을 입력받아야 하는 경우는 거의 없다.

하지만 지금 C를 처음 배우는 사람들은 scanf 함수의 기본적인 사용 방법을 알아야 하는데 이 함수 외에는 콘솔 환경에서 값을 입력받을만한 적당한 방법이 없기 때문이다. 위에 보인 대화상자가 멋있어 보이겠지만 C문법을 처음 배우는 사람에게 저런 대화상자를 만드는 것은 너무 너무 어려운 기술이다. 그래서 당분간은 기본적인 입력을 scanf 함수로밖에 할 수가 없다.

지금 scanf 함수를 알아야 하는 이유는 실제 프로젝트에 이 함수가 필요해서가 아니라 문법 공부를 하는데 이 함수의 도움이 필요하기 때문이다. 요즘같은 그래픽 환경에서 이 함수는 실습용 이상의 의미를 부여하기 어렵다. scanf 함수를 실제로 사용해야 한다거나 더 자세한 사항을 알고 싶다면 레퍼런스를 참고하기 바라되 그렇지 않다면 정수값과 문자열을 입력받을 수 있는 정도의 사용법만 알아도 당장 실습하는데는 별 무리가 없을 것이다. scanf가 아니더라도 공부해야 할 것들이 얼마든지 많으므로 여기서 불필요하게 힘을 뺄 필요는 없다.