printf
데이터를 특정한 형식에 맞춰 stdout에 출력하는 함수
int printf(const char* format, ...);
- 헤더 : <stdio.h>
- return
- 출력한 문자의 개수
- error : -1
형식 태그
형식 태그에 대응하는 인자를 형식 태그가 지정한 형태로 치환해 출력
format 다음으로 오는 인자들의 개수는 반드시 형식 태그의 개수보다 같거나 많아야 한다.
%[flag][width][.정밀도][크기(length)]서식지정자
서식 지정자
서식 지정자 | 역할 | 자료형 |
%c | 단일 문자 한 개 출력 | char |
%s | 문자열 출력 | char * |
%p | void * 형식의 포인터 인자(주소)를 16진수로 출력 | void * |
%d | 10진수 숫자를 출력 | int |
%i | 10진수 정수를 출력 | int |
%u | 부호 없는 10진수 숫자를 출력 (unsigned) | unsigned int |
%x | 소문자를 사용해 숫자를 16진수로 출력 | unsigned int |
%X | 대문자를 사용해 숫자를 16진수로 출력 | unsigned int |
%% | 퍼센트 기호(%)를 출력 | char |
플래그
- | 왼쪽 정렬 |
0 | 수를 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신 0을 삽입 |
. | |
# | o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각 0, 0x, 0X가 붙는다. |
+ | 출력 결과값이 양수여도, + 기호를 앞에 붙여서 출력 음수인 경우는 자동적으로 - 가 붙는다. 기본적으로 지정하지 않은 경우 음수에만 앞에 -가 붙는다. |
(공백) | 앞에 부호가 붙지 않는다면, 한 칸 띄워 출력 |
가변 인자 (variable argument)
헤더 : <stdarg.h>
위의 헤더 사용하면, 함수 선언 시 가변 인자를 가질 수 있다.
- va_list : 길이가 변할 수 있는 인수들을 저장하는 가변의 저장 공간
- va_start(ap, PN)
- 가변 인자 가져올 수 있도록 pointer 설정
- #define va_start(ap, v) (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)
va_list 주소값에 고정인수 크기를 더한 위치로 ap를 초기화 - ap : 가변 인자 저장하는 변수
- PN : 고정 인수, 매크로 내부에서 PN을 기준으로 다음 메모리 pointer로 초기화
- 위의 printf로 예를 들면 va_start(ap, format)
- va_arg(ap, type)
- ap 포인터가 위치한 부분의 데이터를 읽어 반환 후, ap 포인터를 type 길이만큼 뒤로 옮긴다.
- #define va_arg(ap, t) (*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))
- ap += _INTSIZEOF(t) => ap 위치 이동
- ap - _INTSIZEOF(t) => 원래 ap위치의 값을 가져온다.
- ap : 가변 인자 저장하는 변수
- type : 가져올 크기
- ap를 type 크기만큼 순방향으로 이동
- va_end(ap) : 가변 인자 포인터 초기화
- #define va_end(ap) (ap = (va_list)0)
#include <stdarg.h>
// 가변 인자를 저장하기 위한 변수 선언
va_list ap;
// 가변 인자의 시작 포인터 설정
va_start(ap, argc);
// 가변 인자의 값을 2번째 인자의 형식으로 return 받기
va_arg(ap, int);
// 사용 후 va_list 포인터 값을 null로 초기화
va_end(ap);
Line Buffering
버퍼에 개행 문자가 입력될 때 마다 출력
즉, 개행 문자가 들어오지 않으면 버퍼에 계속 쌓아두다가 더 이상 실행할 명령이 없을 때 해당 버퍼의 내용을 출력
'42SEOUL' 카테고리의 다른 글
[born2beroot] Virtual Box 세팅하기 (0) | 2022.06.04 |
---|---|
[born2beroot] 개념 정리 (0) | 2022.05.22 |
[Linux] SIGSEGV (0) | 2022.03.26 |
[C / get_next_line] 파일 디스크립터 (File Descriptor) (0) | 2022.03.16 |
[C / get_next_line] 정적 변수 (static variable) (0) | 2022.03.16 |