[C언어] 표준 출력 함수 printf

라임이·2022년 8월 2일
1

C언어

목록 보기
8/11

해당 C언어 시리즈는 처음 코딩을 접하는 사람들이 쉽게 이해할 수 있도록 작성되었습니다.

표준 출력 함수 printf

우리는 이미 "나의 첫 프로그램. Hello, World!"에서 printf를 사용해 본 적이 있습니다.

printf는 이전에 언급했듯이 출력하다의 print와 정형화된의 formatted가 합쳐진 말입니다. 정형화된 출력 함수라고 보면 됩니다.

변수가 가지고 있는 값을 원하는 형태로 출력할 수 있다는 장점이 있기에 C언어에서는 출력 함수 중 printf를 가장 많이 사용합니다. 다른 출력 함수도 중요하지만 printf만 잘 활용해도 대부분의 출력 작업을 할 수 있기에 꼭 익혀두셨으면 합니다.


서식 지정자(포맷 스트링)

서식 지정자(포맷 스트링)

printf는 서식 지정자(포맷 스트링)라는 형식을 제공합니다. 서식 지정자는 데이터를 출력할 때 어떠한 형태로 출력할지 지정하는 걸 의미합니다.

위의 표에 %d, %f, %lf, %c 등 의미를 도대체 알 수 없는 문자들이 쓰여 있습니다. 늘 강조하듯 코딩을 공부할 때는 어떤 단어의 약자인지 알아두는 게 좋습니다. 원말을 알면 이해도도 높아지고 기억도 오래가기 때문이죠.

다음은 서식 지정자의 원말입니다.

  • %d: decimal(10진법의)
  • %hd: short decimal
  • %u: unsinged(음수를 제외하고 0, 양수만 사용)
  • %o: octal(8진법의)
  • %x: hexadecimal(16진법의)
  • %f: float
  • %lf: long float(double)
  • %c: character(문자)
  • %s: string(문자열: 문자 2개 이상을 뜻함)

원말과 대조하여 꼭 외워주시기 바랍니다.


사용 형식

printf("문자열");

printf는 기본적으로 printf("");의 형태를 가집니다.
출력하고자 하는 문구를 큰따옴표 안에 넣어주면 문구가 출력됩니다.

printf("C언어 프로그래밍");

위의 코드는 다음과 같은 출력값을 가집니다.

C언어 프로그래밍

printf("서식 지정자", 서식 지정자에 부합하는 출력 대상);

위의 형식만 봐서는 이해가 힘들 거라 생각합니다.
다음의 코드를 참고하시면 됩니다.

#include <stdio.h>

void main(void)
{
	int number = 3;
    
    printf("%d", number);
}

변수 number에 값 3이 들어있습니다.

printf 함수를 보면 "" 안에 %d가 들어있음을 확인할 수 있습니다.
%d를 통해 10진 정수의 값을 출력합니다.

"" 뒤에는 ,와 함께 서식 지정자와 매칭되는 값이 옵니다.
, 뒤에 number가 있는 걸 보니 변수 number의 값을 출력하려고 하는 걸 알 수 있습니다.

%d와 변수 number가 매칭되므로 number의 값 3이 출력됩니다.

3
#include <stdio.h>

void main(void)
{
	int number1 = 3;
    int number2 = 5;
    
    printf("%d %d", number1, number2);
}

그렇다면 printf의 "" 안에 서식 지정자가 여러 개 있다면 어떻게 될까요?
"" 안의 서식 지정자가 , 뒤의 값과 순서대로 매칭이 됩니다. 첫 번째 %d는 number1, 두 번째 %d는 number2와 매칭됩니다. 따라서 다음과 같은 결과가 출력됩니다.

3 5

다음은 이전에 배운 아스키 코드를 이용한 예시입니다.

#include <stdio.h>

void main(void)
{
	char ch = 65;
    
    printf("%c의 ASCII 값은 %d입니다.", ch, ch);
}
A의 ASCII 값은 65입니다.

아스키 코드표에서 10진 정수 65는 영문자 A와 매칭됩니다.

첫 번째 서식 지정자는 아스키 코드 표의 문자를 출력하는 %c이기 때문에 변수 ch의 값 65와 매칭되는 영문자 A가 출력됩니다.

두 번째 서식 지정자 %d는 10진 정수를 출력하기 때문에 변수 ch의 값을 그대로 출력하게 됩니다.

서식 지정자 옵션

  • 출력 칸 수 조절
  • 좌/우 정렬
  • 공백 대체
  • 실수의 소수점 자릿수 조절

출력 칸 수 조절

서식 지정자는 특수기호 %와 영문자의 조합으로 이루어져 있습니다.
특수기호 %와 영문자 사이에 숫자를 넣어주면 값이 출력되는 칸 수를 조절할 수 있습니다.

#include <stdio.h>

void main(void)
{
	int number = 3;
    
    printf("[%d] [%3d]", number);
}
[3] [  3]

위 코드와 같이 %와 d 사이에 3이라는 숫자를 넣으면 값을 출력할 때 자릿수와 무관하게 3칸을 확보하고 출력하게 됩니다. 따라서 [  3]과 같이 공백 두 칸과 숫자 3 한 칸, 총 3칸이 출력됩니다.

좌/우 정렬

출력 칸 수 조절 코드에서는 값이 우측으로 정렬되어 나왔다는 사실을 알 수 있습니다.
필요에 따라 옵션을 통해 좌측으로 정렬할 수도 있습니다.

#include <stdio.h>

void main(void)
{
	int number = 3;
    
    printf("[%d] [%-3d]", number);
}
[3] [3  ]

C언어에서 수학에서와 마찬가지로 +를 생략할 수 있습니다.
특수기호 %와 영문자 d 사이에 표시를 하지 않았지만 +가 기본으로 들어가 있기 때문에 값이 우측으로 정렬되어 왔던 겁니다. 위 코드처럼 - 옵션을 넣어주면 출력 결과와 같이 값이 좌측으로 정렬시킬 수 있습니다.

공백 대체

출력 칸 수를 늘렸을 때 문제점 중 하나는 총 몇 칸인지 알기 힘들다는 겁니다. 이러한 상황에서 해결 방법이 하나 있는데 바로 0이라는 옵션을 주는 겁니다.

#include <stdio.h>

void main(void)
{
	int number = 3;
    
    printf("[%d] [%03d]", number);
}
[3] [003]

특수기호 %와 출력 칸 수를 조절하는 숫자 사이에 0이라는 옵션을 넣어주면 빈 출력 칸 대신 0을 넣을 수 있습니다.

실수의 소수점 자릿수 지정

#include <stdio.h>

void main(void)
{
	float pi = 3.141592f;
    
    printf("[%f]", pi);
}
[3.141592]

위 출력 결과를 보면 소수를 출력할 때 소수점 아래 6자리까지 출력되는 걸 확인할 수 있습니다. 출력할 때 소수점 아래 자릿수 역시 마찬가지로 조절할 수 있습니다.

#include <stdio.h>

void main(void)
{
	float pi = 3.141592f;
    
    printf("[%.4f]", pi);
}
[3.1416]

소수점 아래 넷째 자리까지 출력된 걸 볼 수 있습니다.
여기서 주의할 점이 하나 있습니다. 소수점 아래로 자리를 끊어 출력할 때 반올림하여 출력한다는 겁니다. 3.14159이기 때문에 다섯 번째 자리 9를 반올림하여 넷째 자리 5가 6으로 바뀝니다.

#include <stdio.h>

void main(void)
{
	float pi = 3.141592f;
    
    printf("[%7.4f]", pi);
}
[ 3.1416]

위 코드는 출력 칸 수와 소수점 자릿수를 모두 조정한 결과입니다.
그런데 이상한 점이 하나 있습니다. 우리는 분명 출력 칸 수를 7칸으로 지정했는데 공백이 하나밖에 존재하지 않습니다.

소수점도 하나의 칸으로 인정하기 때문입니다.
출력 결과를 보면 정수 5칸, 소수점 1칸, 공백 1칸, 총 7칸이 존재함을 알 수 있습니다.


제어 문자(이스케이프 시퀀스)

printf는 서식 지정자(포맷 스트링) 말고도 제어 문자(이스케이프 스퀀스)를 제공합니다. 우리가 프로그램을 실행했을 때 나타나는 검은색 창을 콘솔 창이라고 부르는데, 콘솔 창의 깜빡이는 요소를 캐럿이라고 합니다.

제어 문자는 캐럿을 이동하는 데에 도움을 주고 외에도 경고음이나 문법적 표기와 겹쳐 사용하지 못하는 문자를 출력하게 해주는 데에도 큰 도움을 줍니다.

제어 문자(이스케이프 시퀀스)

다음은 각 제어 문자별 원말입니다.

  • \a: alert(경고)
  • \b: backspace(뒤로 한 칸)
  • \n: Line Feed, new Line(개행)
  • \r: Carriage Return(복귀)
  • \t: tab(탭: 8칸 단위 띄어쓰기)

주의할 점은 캐럿을 앞으로 옮긴 뒤 다시 출력을 하면 이전의 출력 데이터가 덮어씐다는 겁니다.

printf("A언어");
printf("\rC");
C언어
profile
백엔드 개발이 즐거운 4학년 컴공생

0개의 댓글