본문 바로가기

Programming Language/Embedded C

[C언어] scanf 함수

C를시작하면 printf() 다음으로 많이 접하는 것이 scanf()이다.

단순히 터미널(콘솔)창에서 키보드의 입력을 받아 변수에 값을 저장하는 역할로 알고 쓰게 된다.

하지만 보다 깊이 공부하고 시스템프로그래밍을 공부하다 보면 scanf() 함수가 그리 쉽게 느껴지지는 않을 것이다.

때문에 이번에 scanf() 함수를 좀더 깊이 알아보고 정리하고자 한다.


함수 원형 : int scanf( const char *format, [address... ] )
헤더 파일 : stdio.h
설명 : 입력의 포맷을 지정해서 그 포맷대로 데이터를 입력받는 기능을 제공한다.

1.
#include<stdio.h>

int main()
{
int num1 , num2;
scanf("%d , %d" , &num1 , &num2);

return 0;
}

설명에서 입력의 포맷을 지정한다는 의미가 무엇인지 확실히 이해가 되었는가??
터미널(콘솔)에서 scanf()의 함수를 통해 키보드의 입력을 받는 상태에 놓이게 된다.
입력의 포맷을 지정한 다는 의미는 scanf() 함수의 첫번째 인자의 형식과 똑같은 포맷의 형태로 입력해야 된다는 것이다.
즉 3 , 4 의 포맷으로 입력을 해야 변수 num1 , num2에 3와4의 값이 들어가게 된다.
만약 3 4와 같이 포맷 형식과 다르게 입력을 받게 되면 변수의 값을 다르게 저장 될 것이다.
쉽게 설명하면 scanf("***** %d *****" , &num) 으로 코드를 작성하였다면
터미널(콘솔)에서 ***** 숫자 ***** 의 형태로 입력해야 num에 원하는 값이 들어가게 된다.


2. scanf()는 공백(Enter , tab , space ...)등의 공백을 문자열로 처리하지 않는다.
#include<stdio.h>

int main()
{
char str[100];
scanf("%s" , str);

printf("%s\n" , str);
return 0;
}

터미널(콘솔)에서 프로그래밍이라 입력하면 결과는 프로그래밍이 출력된다.
반면에 프 로 그 래 밍이라 출력하면 "프" 한글자만 출력 될것이다.
이는 scanf()함수는 특징으로 공백을 만나면 공백 전까지만 출력하게 되어있다.
그럼 문자열을 입력받을 때 어떤 함수를 쓰면 좋을까??
다음과 같이 이해하면 이해하기 쉬울 것이다.
단어(love와 같이 공백이 없는 문자열)  --> scanf()
문장(I love you와 같이 공백이 있는 문자열)  --> gets() , fgets()


3.
scanf()의 반환형은??
우리가 scanf()함수를 쓰면서 반환형에 대해 생각해본적이 있는가??
함수의 원형을 보면 기본적으로 반환형은 int 형이다. 그러면 어떠한 갯수를 반환하는 것일까?
결론부터 말하자면 scanf()함수의 첫번째 인자에 해당하는 포맷 형식의 갯수를 반환한다.
즉,
#include <stdio.h>

int main()
{
int num1 , num2 , num3;
int ret1 , ret2 , ret3;
ret1 = scanf("%d", &num1);
ret2 = scanf("%d %d", &num1, &num2);
ret3 = scanf("%d %d %d", &num1, &num2, &num3);

printf("%d , %d , %d\n", ret1, ret2, ret3);

return 0;
}

ret1 은 포맷형식이 하나이기 때문에 1이 출력된다.
rete2은 포맷형식이 2개(%d %d)이기 때문에 2가 출력된다.
ret3은 포맷형식이 3개(%d %d %d)이기 때문에 3이 출력된다.
그외 scanf()은 EOF를 반환하기도 한다.
위 말의 의미는 무엇일까??
먼저 EOF에 대해 알아보자..
보통 우리가 아는 EOF는 파일의 끝을 의미하며 상수 -1로 정의되어있다.
그렇다면 콘솔에서 scanf()를 만나 입력상태가 되면 어떻게 EOF를 반환할 수 있을까??
결과부터 말하면 다음과 같다.

윈도우 계열 : Ctrl+Z를 입력하면 EOF가 반환된다.
유닉스 계열 : Ctrl_D를 입력하면 EOF가 반환된다.

#include <stdio.h>

int main()
{
int num , ret;
while (1)
{
ret = scanf("%d", &num);
if (ret == EOF)
{
fputs("EOF!", stdout);
break;
}
printf("%d\n", num);
}

return 0;
}

위 함수는 터미널에서 계속 입력을 받으면 그 값을 출력해준다.
그러다가 Ctrl+Z를 입력하면(윈도우 계열의 경우) "EOF"라는 문자열을 출력하고
while()을 빠져나오게 된다.


'Programming Language > Embedded C' 카테고리의 다른 글

[C언어] 비트연산  (0) 2016.12.14
[C언어] 진법변환  (1) 2016.11.27