ft_printf (2 일차)

hyungyoo·2021년 2월 12일
0

ft_printf

목록 보기
2/3

width, precision et flag..etc

서식 지정자

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

type : cspdiuxX%

  1. d 와 i
  • %d는 10진수 정수를 입력받는다.
  • 011을 입력받는다면, 11
    %i는 10진수/8진수/16진수를 입력받는다.
  • 011을 입력받는다면, 9
  • 입력받는 va_arg의 타입은 int형
  1. u
  • 부호없는 10진 정수
  • va_arg의 타입은 unsigned int형
  1. x 또는 X
  • 부호없는 16진수의 소문자/대문자
  • va_arg의 타입은 마찬가지로 unsigned int형
  1. c
  • va_arg의 타입은 int형
  • 문자이지만, gcc에서 가변인자로 받은값이 int보다 작으면, int로, float는 double로 지정한다.
  • 즉, char, bool, short -> int
  • float -> double
  1. s
  • 문자열
  • va_arg의 타입은 (char *)형
  1. p
  • 포인터의 메모리주소
  • va_arg의 타입은 (long long)형

flag : - / 0

  1. 기본정렬은 오른쪽정렬
  2. 우선순위는 - > 0
  • 사실 우선순위는 일반적인 type에서는 필요없다. 컴파일 에러가뜨기때문인데, type이 %인경우네는 우선순위처리를 해줘야한다.
gcc main.c && ./a.out | cat -e

printf("%-3%");  ->		%  %
printf("%03%");  ->     00%%   
printf("%-03%"); ->.    %. %
  1. 0은 숫자 그리고 %가 오른쪽정렬일때만 사용된다.
  • 나머지 경우는 0을 입력한것인지, 출력인지를 알수가 없기때문

width

  1. %[width]type 또는 %[*][width]type (숫자또는 *)
    2.일반적으로 그냥 출력인데, width가 더 클때만 그만큼 채워서 출력함
  • 즉, width 가 문자길이보다 작다면, 개무시..
  1. width에는 양수만 입력가능
  • 0 또는 -는 flag의 옵션으로 인식됨 (0은 왼쪽에만붙는다)
    예) 1 -> 00001 과 10000은 다르다, 또한 0은 csp에서는 해당없음
gcc main.c && ./a.out | cat -e

printf("%-3d", 5);  ->	   5  %
printf("%03d", 5);  ->     005%  

printf("%10s", "abcde"); ->   |   abcde%
printf("%-10s", "abcde"); ->  |abcde   %

printf("%*s", 10, "abcde"); ->|   abcde%

/* [*] 음수 */
printf("[%*d]", -2, 5);		->   [5 ]
printf("[%*d]", -2, 123);	//	[123]

/* [-][*] 음수 */
printf("[%-*d]", -2, 5);	//	[5 ]
printf("[%-*d]", -2, 123);	//	[123]

/* [0][*] 음수 */    
printf("[%0*d]", -2, 5);	//	[5 ]
printf("[%0*d]", -2, 123);	//	[123]
char
/* [width] */
printf("[%2c]", 'a');		//	[ a]

/* [-][width] */
printf("[%-2c]", 'a');		//	[a ]

string

/* [width] */
printf("[%2s]", "a");		//	[ a]
printf("[%2s]" "abc");		//	[abc]

/* [-][width] */
printf("[%-2s]", "a");		//	[a ]
printf("[%-2s]", "abc");	//	[abc]

////////////////////////////////////////////

/* [*] 양수 == [width] */

////////////////////////////////////////////

/* [*] 음수 */
printf("[%*s]", -2, "a");	//	[a ]
printf("[%*s]", -2, "abc");	//	[abc]

/* [-][*] 음수 */
printf("[%-*s]", -2, "a");	//	[a ]
printf("[%-*s]", -2, "abc");	//	[abc]

precision

  1. "% .3 d", 5 또는 "% .* d", 3, 5
  2. c 와 p는 해당사항없음
  3. precison이 양수일때,
  • 문자열의 경우
    precision이 문자열의 길이보다작으면, precison만큼 출력
  • 숫자일 경우
    precision이 문자열의 길이보다 크면, 차이만큼 0이 채워짐
  1. precision이 음수일때,
  • default값
양수

/* [][.N] */
printf("[%.2d]", 5);		//	[05] 
printf("[%.2d]", 123);		//	[123]

/* [-][.N] */
printf("[%-.2d]", 5);		//	[05] 
printf("[%-.2d]", 123);		//	[123]

/* [0][.N] */
printf("[%0.2d]", 5);		//	[05]
printf("[%0.2d]", 123);		//	[123]

/* [width][.N] */
printf("[%10.2d]", 5);		//	[        05]
printf("[%5.2d]", 123);		//	[  123]


/* [0][width][.N] */
printf("[%010.2d]", 5);		//	[        05]
printf("[%05.2d]", 123);	//	[  123]

/* [-][width][.N] */
printf("[%-10.2d]", 5);		//	[05        ]
printf("[%-5.2d]", 123);	//	[123  ]


////////////////////////////////////////////

/* [][.0] */
printf("[%.0d]", 5);		//	[5] 
printf("[%.0d]", 123);		//	[123]

/* [-][.0] */
printf("[%-.0d]", 5);		//	[5] 
printf("[%-.0d]", 123);		//	[123]

/* [0][.0] */
printf("[%0.0d]", 5);		//	[5]
printf("[%0.0d]", 123);		//	[123]

/* [width][.0] */
printf("[%10.0d]", 5);		//	[         5]
printf("[%5.0d]", 123);		//	[  123]


/* [0][width][.0] */
printf("[%010.0d]", 5);		//	[         5]
printf("[%05.0d]", 123);	//	[  123]

/* [-][width][.0] */
printf("[%-10.0d]", 5);		//	[5         ]
printf("[%-5.0d]", 123);	//	[123  ]


////////////////////////////////////////////

/* [][.*] 양수 == [][.N] */

////////////////////////////////////////////

/* [][.*] 음수 */
printf("[%.*d]", -2, 5);		//	[5] 
printf("[%.*d]", -2, 123);	//	[123]

/* [-][.*] 음수 */
printf("[%-.*d]", -2, 5);		//	[5] 
printf("[%-.*d]", -2, 123);	//	[123]

/* [0][.*] 음수 */
printf("[%0.*d]", -2, 5);		//	[5]
printf("[%0.*d]", -2, 123);	//	[123]

/* [width][.*] 음수 */
printf("[%10.*d]", -2, 5);	//	[         5]
printf("[%5.*d]", -2, 123);	//	[  123]


/* [0][width][.*] 음수 */
printf("[%010.*d]", -2, 5);	//	[0000000005]
printf("[%05.*d]", -2, 123);	//	[00123]

/* [-][width][.*] 음수 */
printf("[%-10.*d]", -2, 5);	//	[5         ]
printf("[%-5.*d]", -2, 123);	//	[123  ]
음수

/* [][.N] */
printf("[%.2d]", -5);		//	[-05]
printf("[%.2d]", -123);		//	[-123]

/* [-][.N] */
printf("[%-.2d]", -5);		//	[-05]
printf("[%-.2d]", -123);	//	[-123]

/* [0][.N] */
printf("[%0.2d]", -5);		//	[-05]
printf("[%0.2d]", -123);	//	[-123]

/* [width][.N] */
printf("[%10.2d]", -5);		//	[       -05]
printf("[%5.2d]", -123);	//	[ -123]


/* [0][width][.N] */
printf("[%010.2d]", -5);	//	[       -05]			
printf("[%05.2d]", -123);	//	[ -123]	

/* [-][width][.N] */
printf("[%-10.2d]", -5);	//	[-05       ]	
printf("[%-5.2d]", -123);	//	[-123 ]


////////////////////////////////////////////

/* [][.0] */
printf("[%.0d]", -5);		//	[-5] 
printf("[%.0d]", -123);		//	[-123]

/* [-][.0] */
printf("[%-.0d]", -5);		//	[-5] 
printf("[%-.0d]", -123);	//	[-123]

/* [0][.0] */
printf("[%0.0d]", -5);		//	[-5]
printf("[%0.0d]", -123);	//	[-123]

/* [width][.0] */
printf("[%10.0d]", -5);		//	[        -5]
printf("[%5.0d]", -123);	//	[ -123]


/* [0][width][.0] */
printf("[%010.0d]", -5);	//	[        -5]
printf("[%05.0d]", -123);	//	[ -123]

/* [-][width][.0] */
printf("[%-10.0d]", -5);	//	[-5        ]
printf("[%-5.0d]", -123);	//	[-123 ]


////////////////////////////////////////////

/* [][.*] 양수 == [][.N] */

////////////////////////////////////////////

/* [][.*] 음수 */
printf("[%.*d]", -2, -5);	//	[-5] 
printf("[%.*d]", -2, -123);	//	[-123]

/* [-][.*] 음수 */
printf("[%-.*d]", -2, -5);	//	[-5] 
printf("[%-.*d]", -2, -123);	//	[-123]

/* [0][.*] 음수 */
printf("[%0.*d]", -2, -5);	//	[-5]
printf("[%0.*d]", -2, -123);	//	[-123]

/* [width][.*] 음수 */
printf("[%10.*d]", -2, -5);	//	[        -5]
printf("[%5.*d]", -2, -123);	//	[ -123]


/* [0][width][.*] 음수 */
printf("[%010.*d]", -2, -5);	//	[-000000005]
printf("[%05.*d]", -2, -123);	//	[-0123]

/* [-][width][.*] 음수 */
printf("[%-10.*d]", -2, -5);	//	[-5        ]
printf("[%-5.*d]", -2, -123);	//	[-123 ]

출처

https://stdbc.tistory.com/59

관심 있을 만한 포스트

0개의 댓글