🧠
Hi, Daehuyn Lee
  • Fork-my-brain
  • Network
    • 7. "데이터가 전달되는 원리" OSI 7계층 모델과 TCP:IP 모델
    • [Netwhat] 연습문제 정리
    • 11. IP 라우팅(routing) 동작 과정
    • 3. IP address 란?
    • 2. 컴퓨터 구조를 통해 이해하는 파일(File)과 소켓(Socket)
    • 10 "더 편리한 인터넷을 위해" DHCP && DNS 프로토콜
    • 9. 데이터? 세그먼트? 패킷? 헷갈릴 땐 PDU를 알아보자
    • 8. TCP 와 UDP 차이를 자세히 알아보자
    • 5. 서브넷팅(subnetting)으로 네크워크를 효율적으로 관리하자
    • 4. 넷마스크(Netmask)와 서브넷마스크(Subnetmask)
    • 1. 비유로 이해하는 컴퓨터 구조
    • 6. 공인(Public) && 사설(Private) IP의 차이점
  • Django
    • [Django 1] 가상환경에 Django 설치하기
    • [Django 3] Hello World 웹사이트 만들기
    • [Django 9] static 으로 css 로드하기
    • [Django 10] 한 템플릿에서 복수의 css 파일 적용하기
    • [Django 11] URL app별로 관리하기
    • [Django 8] 템플릿 상속
    • [Django 4] MTV 패턴
    • [Django 6] 블로그 model 만들기
    • [Django 2] Django는 어떻게 작동할까
    • [Django 7] '새 글 작성' 기능 만들기
    • [Django 5] 템플릿 언어
  • Projects
    • 예발자닷컴
      • 4. 프론트엔드의 역할은 어디까지 - 더미데이터 만들기
      • 7. [React 리팩토링] CSS Inline Styling에 Props 사용하기
      • 6. [React 리팩토링] JSX에서 조건문 사용해 렌더링하기
      • 3. 예발자닷컴 프론트서버 업데이트 하기
      • 8. [React 리팩토링] 예발자 프로젝트에 Redux 적용하기
      • 5. [React 리팩토링] JSX로 HTML 렌더링하기
      • 1. 👨‍👨‍👦‍👦 Github로 협업 프로젝트 관리하기
      • 2. React Component를 활용한 웹페이지 디자인 연습
  • Git
    • [Git] Interactive Rebase 실습
    • 오픈소스 개발 참여에 필요한 Git 명령어 정리
    • 개발자가 오픈소스를 읽는 방법
    • 오픈소스 프로젝트 시작하기
    • SSH agent ; Passphrase 입력 없이 Push하기
    • SSH로 원격저장소 접속하기
    • [Github] 개인 저장소를 팀 저장소로 변경하기
    • GitHub Dependabot
    • Git add, commit, push 취소하기
    • 깃헙 잔디 관리 팁
    • 원격저장소 여러개 연결하기
    • Typora(마크다운 에디터) 사용법
  • C
    • C Piscine
      • 메모리 구조를 알아보자
      • Makefile 만들기
      • GCC로 정적 라이브러리 파일 만들기
      • 외부 라이브러리 GCC로 컴파일 하기
      • 정적(Static) 변수
      • 저수준 파일 입출력
      • Makefile 자주 사용하는 문법 정리
      • segmentation fault 해결하기
      • C의 구조체 개념
      • 연결 리스트(linked list)에서 이중 포인터 사용하기
      • 로컬에 Norminette 설치하기
    • GetNextLine
      • [GetNextLine] 과제소개-Reading a line on a fd is way too tedious
      • [GetNextLine] 삽질의 기록
      • [GetNextLine] 리팩토링-프로그램의 목적을 고려한 코드
    • ft_printf
      • 1. 과제소개
      • 2. 가변인자 (Variadic Arguments)
      • 3. 형식태그와 서식지정자 printf 함수의 옵션 알아보기
    • Libft
      • [Libft] Bonus
      • [Libft] Test Program
      • [Libft] 나만의 C 라이브러리 만들기
      • [Libft] Part 2
      • [Libft] Part 1
  • UNIX shell
    • [minishell] 4. 종료상태와 에러메세지 처리
    • [minishell] 1. 과제소개 및 선행지식
    • [minishell] 2. 프로그램 구조 및 개발 기록들
    • [minishell] 5. 파이프(Pipe) 처리
    • [minishell] 3. 시그널(Signal) 처리하기
    • [minishell] 6. 리다이렉션(Redirection) 처리
  • Web
    • Next.js
      • [Next.js] CSS모듈과 복수의 class 사용하기
    • Node.js
      • [Node.js] 웹페이지에 파일 띄우기
      • [Node.js] URL에서 쿼리스트링 추출하기
      • [Node.js] '새 글 작성' 페이지 만들기
    • React
      • [React] 2. 컴포넌트(Component) 생성 및 파일별로 분리하기
      • [React] 1. 파일 구조 이해하기
      • [React] 4. 컴포넌트의 State 란
      • [React] 3. 컴포넌트의 Props 란
    • Javascript
      • Click, Enter 두 개의 이벤트 동시에 등록하기
      • Click eventListener 등록하기
      • JavaScript & C 문법 비교
      • JavaScript 객체 지향의 특징
    • CSS
      • [CSS] box-model, display, position
  • Docker
    • ft_server
      • 2. 도커 설치부터 워드프레스 구축까지
      • 1. 선행지식-Docker? Debian Buster? Nginx? ...
      • 3. Dockerfile 만들기
  • Kubernetes
    • 🌌[쿠버네티스 아키텍처] 3. API 호출
    • 🌌[쿠버네티스 아키텍처] 1. 구성 및 설계
    • 🌌[쿠버네티스 아키텍처] 2. 오브젝트 (Objects)
  • Operating System
    • Philosophers
      • [Philosophers] 예시예제로 보는 뮤텍스와 세마포어의 차이
      • [Philosophers] 식사하는 철학자 문제 소개
  • CPP
    • [CPP-08] STL containers, iterators, algorithms
    • [CPP-06] CPP 형변환 연산자
    • [CPP-04 ex02] 인터페이스(Interface) 클래스
    • [CPP-04 ex00] 다형성(Polymorphism) 및 가상함수
    • [CPP-02] Canonical 클래스 복사 생성자와 대입 연산자 오버로딩
    • [CPP-07] Templates
    • [CPP-01] this 포인터와 문자열 스트림(stringstream)
    • [CPP-01] 클래스의 정적할당과 동적할당 new, delete
    • [CPP-01] 파일 입출력 및 문자열 치환하기
    • [CPP-01] 참조자(reference)와 포인터는 다르다
    • [CPP-02] 정수부동소수값 - 고정소수값 변환
    • [CPP-04 ex01] 추상 클래스의 필요성 순수 가상함수
    • [CPP-00] Megaphone! CPP 표준입출력
    • [CPP-03] (ClapTrap이 뭐지) 다중 상속과 가상 상속
    • [CPP-05] 예외 처리 (exception handling)
    • [CPP-00] 객체지향의 관점으로 클래스 이해하기
    • [CPP-01] 랜덤값 얻기
  • IBM Cloud
    • [IBM Cloud] 1. 클라우드 컴퓨팅 개요
    • [IBM Cloud] 5. 클라우드 컴퓨팅의 구성 요소
    • [IBM Cloud] 3. 클라우드 서비스 모델 및 배포 모델
    • [IBM Cloud] 2. 클라우드를 활용하는 새 기술들
    • [IBM Cloud] 4. 떠오르는 클라우드 트렌드
    • [IBM Cloud] 6. 클라우드 스토리지 유형 및 CDN
  • Assembly
    • [libasm] 어셈블리 프로그램 구조와 x64 레지스터 이해하기
    • [libasm] strlen 함수를 어셈블리어로 짠다면
    • [libasm] 어셈블리 명령어(opcode) 정리
Powered by GitBook
On this page
  • tags: ["C","ft_printf","printf","서식지정자","형식문자열","형식태그"]
  • 형식문자열(format)이란?
  • 1. 서식지정자 (format specifier)
  • 2. 형식태그 (format tag)

Was this helpful?

  1. C
  2. ft_printf

3. 형식태그와 서식지정자 printf 함수의 옵션 알아보기

title: ""형식태그와 서식지정자" printf 함수의 옵션 알아보기" description: "형식문자열? 포맷? 형식태그? 서식지정자? 헷갈리는 printf 함수의 옵션들을 정리해보았다." date: 2020-05-22T13:32:31.248Z

tags: ["C","ft_printf","printf","서식지정자","형식문자열","형식태그"]

형식문자열(format)이란?

int ft_printf( const char *format, ... )

표준 출력(stdout) 에 일련의 데이터들을 형식문자열(format)에 지정되어 있는 형태로 출력한다.

형식문자열 다음에는 출력할 데이터들을 쭈르륵 나열해 주면 된다. 이때, 형식 문자열 다음으로 오는 인자들의 개수는 반드시 형식 문자열 속의 형식 태그의 개수보다 같거나 많아야 한다. 이게 무슨 소린가... 아래 설명을 쭉 보면 이해할 수 있다.

(그냥 사용해왔는데 생각보다 복잡했던 프린트에프 구조...)

1. 서식지정자 (format specifier)

ft_printf의 유일한 고정인수 format은 서식문자열, 형식문자열, 포맷 이라고 불린다. 이 포맷은 흔히 우리가 출력하고자 하는 문자열이고, 이 문자열 안에는 % 문자로 시작하는 서식지정자(format specifier) (혹은 서식 문자)가 존재한다. 정수, 실수, 문자, 문자열, 포인터 주소 등을 출력하는 역할을 한다.

이 서식지정자에 다양한 플래그, 폭, 정밀도, 길이 등의 옵션을 조합해서 사용할 수 있다.

2. 형식태그 (format tag)

서식지정자에 옵션을 추가하려면 정해진 형식 태그(format tag) 의 형태를 지켜야 한다. ft_printf의 가변인자 (...) 에 들어오는 인자를 형식태그가 지정한 형태로 치환(대응)되어 출력되는 것이다. 이제 위에서 말했던 가변인자의 개수 >= 형식 태그의 개수 조건이 이해된다.

ft_printf 의 형식태그는 아래와 같은 꼴로 생겼다.

%[flag][width][.precision]서식지정자
  • 형식태그의 첫 번째 문자는 반드시 %문자여야 한다. %문자를 출력해야 한다면 두 번을 중복시켜서 %%와 같이 사용한다.

  • 형식태그는 출력할 값에 대해 각각 적용된다. 출력할 값이 3개라면 %문자 또한 세 번 나와야 한다.

  • 최소한의 형식태그는 %와 서식지정자로 구성된다. [] 로 둘러싸인 부분은 옵션이므로 생략할 수 있다.

옵션 별 기능을 하나씩 자세하게 살펴보자

1) 플래그 (flag)

플래그

설명

-

필드에서 값을 왼쪽으로 정렬한다. 기본은 오른쪽 정렬

0

오른쪽 정렬일 때 공백을 0으로 매꾼다.

.

.n (n은 10진수) 실수일 때 소수점 이하의 자릿 수를 결정한다. 일부 specifier에서만 사용 가능하고 그 외의 값에서는 무시한다. (실수형, 문자열, 정수형에서 사용 가능)

*

서식문자로 출력할 인수 앞에 가변인수로 필드의 폭(width)을 결정한다.

  • 여러 개의 플래그를 동시에 사용할 수 있다.

예제

int num = 7;
printf("%0*d", 5, num); >>00007
printf("[%-6d]", 123); >>[123   ]

2) 폭 (width)

  • 출력할 값의 최소 너비(폭)을 지정한다.

  • 출력할 값이 지정한 폭보다 작으면 자릿수를 맞추기 위해 공백 또는 0을 채워 넣는다.

  • 출력할 값이 지정한 폭보다 크면, 값이 잘리면 안되기 때문에 width 옵셥은 무시된다.

  • width에 음수가 할당되면 -플래그(좌측정렬) + width로 간주한다.

폭을 지정하는 두 가지 방법

  1. [숫자] : % 뒤에 나오는 10진수 숫자가 곧 지정한 폭이 된다.

  2. [*] : 숫자 와일드카드. 가변인자로 폭을 지정한다.

여기서 주의할 점은, 필드의 폭을 지정할 때 1번처럼 변환 문자 앞에 숫자로 적던지, * 와일드카드로 인수로 받던지 둘 중 하나만 가능하다. 동시에 사용 불가!

예를 들어,

printf("%3d", 123) OR printf("%*d", 3, 123) 둘 중 하나만 허용.

3) 정밀도 (precision)

  • 출력할 값의 정확도를 위한 자릿수를 설정한다. 즉, 몇 자리까지 출력해야 된는지.

  • 꼭 앞에 마침표(.) 를 찍어야 한다. 폭과 구분하기 위해서.

  • 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.

  • 출력할 값이 정수(d, i)일 때

    최대 자릿수를 맞추기 위해 0을 추가한다. 자릿수가 출력할 값보다 작을 경우에는 정밀도 옵션을 무시한다.

  • 출력할 값이 실수일 때

    소수점 이하의 최대 자릿수를 가리키고, 자릿수에 따라 반올림이 되거나 소수점 이하에 0이 추가된다. 실수 전체의 자릿수 설정은 width옵션을 사용한다.

  • 정밀도에 음수가 할당되면 무시한다.

  • 정밀도가 정밀도이면서 동시에 서식지정자인 경우 ... X

    예를 들어,

    printf("%.d", 7); >>7

    0000007 이 출력되나 싶었지만 그냥 7만 출력됨.

4) 서식지정자 (type)

type

출력 형태

예시

c

문자

a

d or i

부호 있는 10진법으로 나타난 정수

392

s

문자열

sample

p

포인터 주소

B800:0000

u

부호없는 10진법으로 나타낸 정수 (unsigned int)

7235

x

부호없는 16 진법으로 나타낸 정수 (소문자 사용)

7fa

X

부호없는 16 진법으로 나타낸 정수 (대문자 사용)

7FA

Previous2. 가변인자 (Variadic Arguments)NextLibft

Last updated 3 years ago

Was this helpful?

⚠ 실제 printf의 형식태그는 정밀도(precision) 다음에 크기(length) 옵션이 추가된다. ft_printf는 printf의 약간 간소화 버전이라고 할 수 있다. 앞으로 정리하는 모든 옵션들은 ft_printf 과제를 기준으로 작성할 것이기 때문에 실제 printf의 옵션을 참고할 때는 를 확인...

플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 중에서 - , 0 , . , * 을 사용 할 수 있어야 한다.

여기
다양한 printf 플래그