입력 함수(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이라고 생각하자. 그리고 A10이라는 값을 넣으면 다음과 같다.

주소    값
100    123
101    (쓰레기 값에서 ▶ 10으로 바뀜) ◀(변수 A의 주소)
102    2342
103    9237

이때 A의 값은 10이고 &A의 값은 101이다. 즉 &[변수]는 변수가 저장되어 있는 위치를 뜻한다.

다음으로 scanf의 작동원리를 알아보자.

  1. 사용자로부터 데이터를 입력받는다.
  2. 입력받은 값을 *레지스터에 저장한다.
  3. 변수의 주소에 찾아간다.
  4. 변수의 주소가 가리키는 메모리에 레지스터의 값을 저장한다.
  5. 레지스터에 저장된 값을 삭제한다.

*레지스터(register) : 컴퓨터의 프로세서 내에서 데이터를 보관하는 기억 장소이다.

즉 scanf를 사용하기 위해서는 변수의 주소가 필요하다. 그러므로 변수 앞에 &를 사용해야 한다.

감사합니다.


출력 함수와 형식 지정자(printf, format specifiers)

이스케이프 시퀀스(escape sequence)

변수와 자료형(variables, data types)

산술 연산자(arithmetic operator)


<< 이전글 홈으로 가기 post 목록 보기 다음글 >>
printf 함수와 형식 지정자     Github blog를 검색이 되게 설정하기