본문 바로가기

프로그래밍/C Lang

C언어 강좌 11 :: 표준입력함수 - scanf -


     11. 표준입력함수 :: scanf


학습목표

1. scanf함수를 통해 입력받는 방법을 익힌다.

2.서식문자의 역할을 이해한다




일단 따라해보세요


#include <stdio.h>


int main()

{

int num;

printf("num의 값을 입력해주세요 : ");

scanf("%d",&num);


printf("num : %d\n",num);

return 0;

}




scanf함수는 'stdio.h'에 정의되어있는 표준입력함수이며 콘솔창에서 사용자에게 값을 입력받을 때 사용됩니다. scanf함수가 호출되면 프로그램은 잠시 실행흐름이 중지되며 입출력상태로 돌입합니다. 요구되는 만큼의 입력값이 입력될 때까지 이 상태는 지속됩니다.




scanf함수 사용하기


scanf함수를 사용하기 위해 우리는 두가지를 먼저 고려해야 합니다.


1. 어떠한 변수에 입력을 받을 것인가

2. 어떠한 자료형으로 입력받을 것인가


scanf함수는 어떠한 자료형을 입력받을 것인지 정하기 위해 서식문자를 사용합니다. scanf함수를 호출할 때 전달되는 문자열은 단순히 서식문자를 전달해주기 위한 용도로 사용됩니다. 또한 scanf함수는 입력받을 변수의 메모리 주소값을 인수로 요구합니다. 다음 예제코드와 같이 변수의 이름앞에 기호&를 붙여주게 되면 변수의 메모리 주소를 얻을 수 있습니다.


int num;

scanf("%d",&num);


위의 코드는 "변수 num이라는 공간에 입력받은 값을 정수형태로 저장하라"라고 해석되며 아래와 같이 진행됩니다.



scanf함수를 통해 변수에 값을 입력받을 때 변수의 메모리 주소를 전달해주어야 하는데 변수의 메모리 주소는 변수의 이름앞에 &기호를 붙이면 얻을 수 있습니다. 메모리 주소를 전달해주어야하는 이유는 외부의 함수에서는 다른 함수의 변수에 접근할 수 있는 방법이 메모리 주소를 통한 접근밖에 없기 때문입니다. scanf함수 내부에서 num과 같은 다른 함수의 변수에 입력값을 대입하기 위해서는 메모리 주소 접근이 반드시 필요합니다.






ㆍ버퍼


버퍼란 데이터를 잠시 저장하는 메모리 공간의 이름입니다. scanf함수를 호출하게 되면 프로그램은 잠시 중단되며 입출력 상태가 되고 이 버퍼라는 메모리공간을 반복적으로 확인합니다. 우리가 콘솔창에 키보드로 값을 입력하고 엔터를 누르게 되면 버퍼라는 공간에 입력값들이 전달되며 그 값들을 scanf가 사용하게 됩니다. 예를 들어 다음코드를 생각해보겠습니다.


int x, y, z;

scanf("%d%d%d",&x,&y,&z);


위와 같은 코드가 작성된 프로그램을 실행한 후 scanf함수가 호출되어 입출력 상태가 되었을 때 10 20 30을 입력한 후 Enter키를 누르게 되면 다음과 같은 과정이 일어납니다.



scanf함수는 3개의 값을 입력하기를 요구하고 있으므로 3개의 값이 입력되기 전까지는 입출력상태가 풀리지 않습니다. 예를 들어 10을 누르고 Enter키를 눌러도 2개의 값이 남아있기때문에 계속해서 사용자에게 입력을 요구합니다.









ㆍ서식 문자


scanf함수에서는 입력받은 값을 어떤 형식으로 저장할 것인지 가르키는 용도로 서식문자를 사용합니다. 서식문자의 종류는 다음과 같습니다.


scanf함수로 어떠한 변수에 값을 입력받을 때 꼭 지켜주어야 할 것은, 변수의 메모리 주소를 같이 넘겨주어야 한다는 점입니다. 어떠한 메모리 주소를 구하는 방법은 변수의 이름앞에 기호 &를 붙여주기만 하면됩니다. 이 내용은 포인터와 관련이 깊습니다. 자세한 내용은 포인터에서 다루도록하고 지금은 약속인 것처럼 받아들이셔도 무방합니다.




ㆍ두개 이상의 값 동시에 입력받기


scanf함수가 어떤 방식으로 사용자에게 입력을 받는지 알아보았으니 이번에는 두개이상의 값을 한번에 입력받는 법을 알아보겠습니다. 형식은 다음과 같습니다.


int x,y;

scanf("%d%d",&x,&y);

printf("x is %d y is %d\n",x,y);


scanf함수는 입력값을 구분할 때 공백을 기준으로 합니다. 예를 들면 띄어쓰기나 탭, 엔터키가 공백으로 사용될 수 있습니다.




버퍼에 대한 존재를 우리가 알고 있다면 scanf함수를 자유자재로 다룰 수 있습니다.



주의할 점


scanf함수를 사용하면서 전달되는 문장 "%d~~"는 단순히 서식문자를 위한 공간입니다. 따라서 이 문장 내부에 서식문자 외의 것들을 적게되면 내부적으로 오류가 발생할 수 있습니다.


scanf함수는 메모리의 주소값만을 인자로 요구합니다. 따라서 변수의 이름앞에는 항상 메모리 주솟값을 반환하는 &기호를 붙여야 합니다.


float형은 %f로 double형은 %lf로 받아야 합니다. 이유는 float형과 double형은 다른 자료형이기 때문입니다.








생각해보기...01


#include <stdio.h>


int main()

{

int num;

scanf("%d",&num);


printf("%d",num+5);


return 0;

}


Q. 위의 코드를 컴파일한 후 실행하여 '5'를 입력할 경우 그다음엔 무슨 값이 출력될까요?


Q. 기호 &가 변수의 이름앞에 붙게되면 어떤일이 일어나나요?