입력 함수(scanf)
by atomic0x90 (Yujun Han)
입력 함수(scanf)란?
프로그램 사용자로부터 입력을 받기 위한 함수이다.
입력 함수는 키보드로부터 입력된 데이터를 지정된 형식으로 변환하여 변수에 저장하는 역할이다.
입력 함수(scanf)의 원형
int scanf (const char *format, ...);
입력 함수(scanf) 사용법
scanf도 printf와 마찬가지로 형식 지정자를 사용한다. 
형식 지정자를 모르거나 자세하게 알고 싶으면 이곳을 눌러 확인하자. 
scanf와 printf의 형식 지정자가 다른 경우가 있다. 바로 %d 와 %i이다.
- %d: singed 10진수를 입력받음
- %i: 10진수/8진수/16진수를 입력받음
scanf와 printf의 사용법은 크게 다르지 않다. 예시를 통해 알아보자.
첫 번째 예시
#include <stdio.h>
int main()
{
	int test1,test2,test3;
	printf("test1을 입력하세요 ! :");
	scanf("%i",&test1);		//17을 16진수로 표현하면 0x11이다.
	
	printf("test2를 입력하세요 ! :");
	scanf("%i",&test2);		//9를 8진수로 표현하면 011이다.
	printf("test3을 입력하세요 ! :");
	
	scanf("%d",&test3);
	printf("\ntest1의 값 : %d\n",test1);
	printf("test2의 값 : %d\n",test2);
	printf("test3의 값 : %d\n",test3);
	return 0;
}
결과
test1을 입력하세요 ! :0x11
test2를 입력하세요 ! :011
test3을 입력하세요 ! :011
test1의 값 : 17
test2의 값 : 9
test3의 값 : 11
첫 번째 인수인 %i는 형식 지정자로서 16진수, 8진수, 10진수의 데이터를 받을 것임을 알려준다.
두 번째 인수인 &test1, &test2는 입력을 받을 변수의 주소를 나타낸다.
첫 번째 인수인 %d는 형식 지정자로서 10진 정수형의 데이터를 받을 것임을 알려준다.
두 번째 인수인 &test3은 입력을 받을 변수의 주소를 나타낸다.
%i는 16진수, 8진수도 입력이 된다는 것을 알 수 있다.
두 번째 예시
#include <stdio.h>
int main()
{
	int test;
	printf("정수를 입력하세요 ! :");
	scanf("%d", &test);
	printf("입력하신 정수는 %d입니다.\n",test);
	return 0;
}
결과
정수를 입력하세요 ! :144
입력하신 정수는 144입니다.
첫 번째 인수인 %d는 형식 지정자로서 10진 정수형의 데이터를 받을 것임을 알려준다.
두 번째 인수인 &test는 입력을 받을 변수의 주소를 나타낸다.
scanf는 변수 앞에 &앰퍼샌드(ampersand) 기호가 있다. 
변수는 메모리에 생성된다. 따라서 변수는 주소를 가지고 있다. 
변수 앞에 &를 붙이면 변수의 주소를 의미한다.
입력 함수(scanf)에 &(ampersand)를 사용하는 이유
scanf에 &를 사용하는 이유를 알기 위해서는 메모리의 주소에 대해서 알아야 한다.
예를 들어 A라는 변수를 생성해서 A의 주소가 101이라고 생각하자. 
그리고 A에 10이라는 값을 넣으면 다음과 같다.
주소    값
100    123
101    (쓰레기 값에서 ▶ 10으로 바뀜) ◀(변수 A의 주소)
102    2342
103    9237
이때 A의 값은 10이고 &A의 값은 101이다. 즉 &[변수]는 변수가 저장되어 있는 위치를 뜻한다.
다음으로 scanf의 작동원리를 알아보자.
- 사용자로부터 데이터를 입력받는다.
- 입력받은 값을 *레지스터에 저장한다.
- 변수의 주소에 찾아간다.
- 변수의 주소가 가리키는 메모리에 레지스터의 값을 저장한다.
- 레지스터에 저장된 값을 삭제한다.
*레지스터(register) : 컴퓨터의 프로세서 내에서 데이터를 보관하는 기억 장소이다.
즉 scanf를 사용하기 위해서는 변수의 주소가 필요하다. 그러므로 변수 앞에 &를 사용해야 한다.
감사합니다.
Related Posts
출력 함수와 형식 지정자(printf, format specifiers)
변수와 자료형(variables, data types)
| << 이전글 | 홈으로 가기 | post 목록 보기 | 다음글 >> | 
|---|---|---|---|
| printf 함수와 형식 지정자 | Github blog를 검색이 되게 설정하기 | 
