1. 필수개념

printf란?

  int printf(const char *format, ...)
  • 인자
    * 출력할 문자열
  • 반환값
    * 출력될 문자의 개수 ex) "NUM:%d\n" -> 리턴 값은 엔터를 포함해 6이 된다.

가변인자

  • 두번째 인자 ...는 개수가 정해지지 않은 인자가 들어올 것임을 알린다. (가변인자)
  • 여기를 참고함.

2. printf Format PlaceHolder Syntax (서식 표기 구문)

%[parameter][flags][width][.precision][length]type

1. parameter(optional)

[option]

n$n은 숫자를 의미하며, 대체할 매개 변수의 번호를 의미한다. 제공된 매개 변수를 n$꼴의 형태로 나타내어, 매개 변수를 다른 순서로 여러 번 출력할 수 있다.
#include <stdio.h>

int	main(void)
{
	printf("%2$d %2$#x; %1$d %1$#x", 16, 17);
	return (0);
}

result -> 17 0x11; 16 0x10

n의옵션을통해서n번째인자의출력을만들어낼수있는것이다.16,17은순서대로1번째,2번째인자이므로.1의 옵션을 통해서 n번째 인자의 출력을 만들어낼 수 있는 것이다. 16, 17은 순서대로 1번째, 2번째 인자이므로. 1은 16의 출력을, 2$은 17의 출력을 낼 수 있는 것이다.

2. flags(optional)

default
-(minus)좌측 정렬을 수행한다.우측 정렬
+(plus)양수일 떄는 +, 음수일 때는 - 표시한다.음수만 부호표시
" "(space)양수일 때는 부호를 생략하고 공백으로 표시한다. 단, 음수일 때는 -를 표시한다.
0(zero)width 필드에 주어진 옵션자리에 맞춰 빈 자리에 0을 추가하고, - (minus)와 사용될 경우 좌측 정렬을 하기 때문에 무시하게 된다.
type 필드의 수를 표기하는 d, i, o, u, x, X를 사용할 때 .preicison 필드도 함께 이용되면, 주어진 옵션만큼 빈 자리를 0으로 채운다.
'(apostrophe)정수와 지수에 천 단위 구분자를 표시한다. ex) 1,000
#(hash)각 진법과 형식에 맞게 0, 0x, 0X를 추가한다..precision 필드의 e, E, f, a, A 옵션과 사용될 경우 소수점에 영향을 준다. .preicison 필드의 g, G 옵션도 마찬가지로 소수점에 영향을 주고, 0이 잘리는 현상을 방지한다. type 필드의 c, s, d, i, u옵션과 사용되면 #를 무시한다.

3. width(optional)

width 필드는 단어 뜻 그대로 출력 너비를 설정한다. .precision 필드의 옵션과 사용되면 옵션 값을 고려하여 너비 값을 적용한다. (.precision에서 자세히 살펴보자.)

nn은 숫자를 의미하며, 양수만 사용 가능하다. 음수를 사용하면 부호 - 를 flags 필드의 - (minus)로 인식한다.
*(asterisk)너비 값을 인자로 받아서 사용한다. * (asterisk)에 할당될 인자로 받은 값보다 서식 지정자에 따라 대치될 인자로 더 긴 값이 들어오면 원래 길이만큼 출력한다.

너비 값 < 주어진 값의 길이

#include <stdio.h>

int	main(void)
{
	printf("%*d", 2, 100);
	return (0);
}

result -> 100

위 코드는 주어진 너비 값 2를 무시하고 원래 값 100을 출력한다.
너비 값 ≥ 주어진 값의 길이

#include <stdio.h>

int	main(void)
{
	printf("%*d", 2, 1);
	return (0);
}

result -> 1

4. .precision(optional)

설명이 길어 생략한다. 출처에 나와있는 표와 예시(토글)를 참고하자.

5. type(required)

  • d & i option' diff

d 옵션은 부호가 있는 10진 정수를 입력으로 받지만, i 옵션은 부호가 있는 8진, 10진, 16진 정수를 입력으로 받을 수 있다. 단, i 옵션으로 입력을 받을 때는 특정 형식을 맞춰야만 printf 함수 내에서 이를 해석할 수 있다. 아래 코드를 살펴보자.

#include <stdio.h>

int	main(void)
{
	printf("%d\n", -42); // 10진수
	printf("%i\n", -052); // 8진수
	printf("%i\n", -0x2a); // 16진수
	printf("%i\n", -0x2A); // 16진수
	return (0);
}

  • f & F option' diff
    inf, infinity, nan 등 표현가능한 범위 밖의 수들을 표현할 때 f의 경우 -> 소문자로, F의 경우 대문자로 출력한다.
    f option : inf, infinity, nan
    F option : INF, INFINITY, NAN

  • n option' example

#include <stdio.h>

int	main(void)
{
	char	len;

	printf("hello init 6!%hhn\n", &len);
	printf("length : %hhd", len);
	return (0);
}

result -> hello init 6!
length : 13 (인자를 포함한다면 14가 나왔어야함.)

6. Escape Sequence(Not a Field, String of Characters)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN