본문 바로가기

mandle.Making/C언어

c언어 기초 scanf 함수의 이해

우리는 앞에서 printf 함수를 이용해서 pc에 원하는 메세지를 띄우는 코드를 연습했습니다. 이 함수는 출력의 의미를 갖는 함수입니다.

출력함수가 있다면 물론 입력함수도 있겠죠? 오늘은 키보드로부터 데이터를 입력 받는 입력 함수 scanf에 대해서 살펴보겠습니다.

scanf 함수를 이용하면 다양한 형태의 데이터를 키보드로부터 입력받을 수 있습니다. 다양한 형태란 앞에서 배운 정수, 문자, 문자열 등을 말합니다.

오늘은 그중 정수형태로 입력받는 방법에 대해서 설명하겠습니다.


우선 scanf 함수의 기본적으로 int a;    scanf("%d", &a); 와 같은 형태를 보입니다. printf의 형태와 상당히 유사한것을 느낄 것입니다. 

코드에 대해서 설명하면 먼저 입력받은 데이터를 저장할 메모리 공간을 할당해야 합므로 입력 함수앞에 a라는 이름의 변수를 선언하고 있습니다. 그리고 다음줄에서 scanf 함수를 호출하면서 두번째 전달 인자로 a를 넘겨주고 있습니다. 앞에 printf 함수의 설명을 할 때 %d를 서식 문자라고 설명했습니다. 그리고 %d는 데이터를 정수형으로 출력하라는 의미라는것을 앞에서 이야기 했습니다. scanf에서도 %d는 printf 함수와 큰 차이가 없습니다. 데이터를 정수형으로 입력받으라는 의미로, 함수의 기능인 입력과 출력이 나뉠뿐 서식 문자의 뜻은 변하지 않는것을 알 수 있습니다.


 두  함수 사이에 서식 문자는 같은 뜻을 가지고 있다고 말씀드렸고, 두 함수의 형태 역시 비슷합니다. 하지만 두 함수간에 다른점이 하나 있습니다. 바로 scanf 함수에서 2번째 인자의 변수앞에 &가 붙어 있다는 것입니다. 궁금증을 해소하고 싶겠지만, 만약 c언어를 처음 배우는 분들이라면 지금 이해할 수 있는 내용이 아닙니다. 뒤에서 배울 포인터와 함수에 대해서 더 깊이 공부해야만 이해 할 수 있는 내용입니다. 그러니 지금은 공식처럼 scanf 함수 호출 시 입력받은 데이터를 저장 할 변수 앞에 무조건 &를 붙여 줘야 한다는 것만 알고 넘어가도 충분합니다.


우리는 앞에 printf 함수에 대한 이야기를 할 때 출력 형태를 정수뿐만이 아닌 문자, 문자열 등의 다양한 형태로 출력할 수 있다는 것을 알게되었습니다. scanf 함수 역시 마찬가지로 입력 형태를 다양하게 지정하는 것이 가능합니다. 입력 형태를 다양하게 지정한다는 것은 데이터를 세개 입력받을 때, 첫 번째 데이터는 10진수 정수형, 두번째 데이터는 16진수 정수형, 세번째 데이터는 문자 등으로 입력받는 데이터의 형식을 지정하는 것이 가능하다는 것입니다.

scanf("%d %x %c". &a, &b, &c); 다음 코드는 한번의 함수 호출을 통해서 여러 개의 데이터를 한번에 입력받을 경우에 사용됩니다. 그리고 다양한 서식 문자를 통해서 다양한 형태의 데이터를 입력받기 위해 형식을 지정 해놓은것도 확인 할 수 있습니다. 지금 전에 이야기한 서식 문자는 %d(10진수 정수형)뿐입니다. 서식 문자의 여러가지 형태가 있지만, 그것은 후에 이야기 할 것 입니다. 오늘은 대충 넘어가셔도 무방하겠습니다. 참고로 %x는 16진수 정수를 표현하는 서식 문자이며, %c는 문자를 표현하는 서식 문자입니다. 


마지막으로 scanf 함수를 사용 할 때 참고해야할 점은 데이터의 경계를 공백으로 구분한다는 것입니다. 만약 다음과 같은 코드 scanf("%d %x %c". &a, &b, &c); 는 한번에 총 세 개의 데이터를 입력받는데, 서식 문자 3개 사이에 space로 띄워진 공백이 있는것을 확인했을 것 입니다. 그러면 이때 프로그램을 실행시켜 세 개의 데이터를 입력 할 때, 데이터를 하나씩 입력할 때마다 space로 공백을 만들어 주어야합니다.  


오늘 입력 함수에 대해서 이야기 할 때 계속해서 출력 함수를 비교해서 설명했습니다. 그만큼 두 함수가 유사한 형태를 지니고 있다는 것을 알수 있었습니다.

이 두 가지의 함수는 앞으로 c언어를 사용하는 한 아마도 가장 많이 다루게 될 함수가 될 것입니다.

'mandle.Making > C언어' 카테고리의 다른 글

Arduino 16x2 character LCD I2C 제어하기  (0) 2017.12.19
c언어 기초 컴퓨터의 데이터 표현 방식  (0) 2017.02.23
c언어기초 변수와 연산자  (0) 2017.02.21
자료구조란  (0) 2017.02.19