본문 바로가기
C, C++/문법 정리

[C언어] 표준 입출력 - printf()와 scanf()

by hseoy 2020. 11. 10.
반응형

이 글에서는 이전 글에서 미처 살펴보지 못한 채 계속 사용하고 있던 printf()함수와 scanf()함수에 대해서 살펴보려고 한다.

먼저 printf()함수와 scanf()함수를 사용하기 전에 반드시 상단에 작성하는 코드 한 줄에 대해 언급하고 넘어가겠다.

#include <stdio.h>

stdio.h라는 헤더 파일은 printf()함수와 scanf()함수에 대한 정의를 가지고 있는 헤더 파일로 stdio는 standard input output 의 약자로 표준 입출력에 대한 모든 내용을 포함하고 있는 헤더파일이다.

이 헤더파일 내에는 printf()함수와 scanf() 함수 외에 표준 입출력, 출력과 입력을 할 수 있는 많은 함수와 관련 변수들이 있지만 여기서는 가장 많이 사용되는 두 가지 함수, printf()함수와 scanf()함수에 대해서 예제를 보며 이해해보도록 하자.

#include <stdio.h>

int main()
{
    int value = 0;
    scanf("%d", &value);
    printf("value = %d\n", value);
    return 0;
}

위 예제는 정수형(int)의 변수 값을 입력받아 그대로 출력하는 프로그램이다. 이 예제 프로그램을 작성하는 데 있어서 scanf()함수와 printf함수를 사용했다. 이제 각각에 대해서 살펴보자.

먼저 scanf함수에 대해서 살펴보자. scanf() 함수에서 첫 번째 인자는 입력 받을 형식을 지정하는 문자열이다. 여기서는 "%d"를 사용했는 데 이는 10진수의 정수를 입력받겠다는 의미이다. 입력을 받으면 저장을 해야 하는 데 scanf()함수는 어디에 저장하게 될까? 그것은 두 번째 인자에 답이 있다. 두 번째부터 오는 값은 첫 번째 인자의 서식 문자와 1:1로 매칭되는 메모리 주소값이다. 예를 들어 %d는 10진수의 정수를 입력받는다는 것을 의미한다고 했다. 그렇다면 두 번째 오는 인자는 10진수의 정수를 입력받을 수 있는 변수의 주소값이어야 한다. 여기서는 int형의 변수 value의 주소값(주소값은 변수에 &를 사용함)을 주었다. 

여기서 중요한 건 서식 지정자(format specifier)이다. %d와 같은 형식을 지정하는 문자를 서식 지정자라고 하는 데 이 문자들은 값의 형태, 크기(byte), 등에 따라서 달라진다. 

%d 10진수 정수
%o 8진수 정수
%x / %X 16진수 정수
%u 부호 없는 10진수 정수
%c 문자 하나(아스키코드 1개 글자)
%s 문자열
%f 고정소수점 방식으로 실수
%e 부동소수점 방식으로 실수

이러한 서식 지정자의 조합에 따라 입력받는 값을 1개로 할 수도 2개로 할 수도, 실수나 정수, 문자열을 입력받을 수도 있다. 예를 들어 아래와 같이 사용하게 되면 정수와 실수, 문자열을 입력받을 수 있다. 서식 지정자와 1:1 매칭되도록 변수들을 순서대로 인자로 넘겨줘야 한다.

int a = 0;
float b = 0.0f;
char c[100] = {0,};
scanf("%d %f %s", &a, &b, c);

printf() 함수의 경우에도 scanf()함수와 사용법이 거의 유사하다. printf() 함수의 경우에는 변수의 주소값에 값을 입력받아 넣는 것이 아니라 그 반대로 변수의 값을 서식 지정자의 위치에 출력한다. 예를 들어 아래와 같은 경우 "Hello %d"에서 %d를 value의 값 5를 치환해서 출력한다.

int value = 5;
printf("Hello %d", value);
Hello 5

printf() 함수도 scanf()함수와 서식 지정자를 공유하므로 위의 표와 같이 사용하면 된다. %d는 정수를 10진수로 출력하고, %X는 16진수 대문자로 정수를 출력하는 형태이다.

int a = 255;
printf("%d %X", a, a);
255 FF

여기까지 설명했으면 어느 정도 printf()함수와 scanf()함수가 어떻게 돌아가는 지 정도는, 아니 어떻게 "사용"하는 지 정도는 이해했을 거라 본다. 자세한 내용은 자신이 직접 여러 코드들을 작성해보며 탐구해보길 바란다.

반응형

댓글