Unborn 8.0 Yellow Pointer
본문 바로가기
42 SEOUL/1_ft_printf

[42Seoul/ft_printf] 서식지정자 (format specifier)

by 에삐니 2022. 4. 19.
728x90

1. 서식지 정자

printf, sprintf, fprintf에서 사용하는 서식 지정자(format specifier)는 다양한 활용법이 있다.

%[플래그][폭][. 정밀도][길이] 서식지정자

printf는 위와 같이 서식지정자를 조합해서 사용할 수 있다.

다양한 서식지정자가 있으나, ft_printf에서 구현할 서식 지정자는 c, s, d, i, u, p, x, X, % 이다.

  • c : 문자, (va_arg type, int)
  • s : 문자열, (va_arg type, char *)
  • d, i : 부호 있는 10진 정수, (va_arg type, int)
  • u : 부호 없는 10진 정수, (va_arg type, unsigned int)
  • p : 포인터 메모리 주소, (va_arg type unsigned long long)
  • x, X : 부호 없는 16진 정수 (va_arg type, unsigned int)
  • % : % 출력

 

2. csdiupxX%

2.1 %c

c는 문자를 출력하는 서식지정자인데, 자료를 받을 때 int형으로 받게 된다. 이유는 GCC(C표준)에서는 가변 인자로 받은 값이 int보다 작다면 int를 지정해야 하기 때문이다. (float는 double로 지정해야 한다.)

2.2 %d와 %i의 차이

printf 같은 출력은 둘에 차이가 없지만 scanf 같은 입력 형식 지정자일 때 %d는 signed 10진 정수를 입력받고 %i는 10진수/8진수/16진수를 입력받는 차이가 있다.

#include <stdio.h>

int main(void) 
{
        int a;

        scanf("%i", &a); //011을 입력하면 9
        scanf("%d", &a); //011을 입력하면 11
    
        return (0);
}

2.3 %x와 %X의 차이

printf에서 x는 16진수 소문자를 출력하게 되고 X는 16진수 대문자를 출력하게 된다.

#include <stdio.h>

int main(void)
{
	unsigned int a = 999;
    
    printf("%x\n", a);	// 3e7
    printf("%X\n", a);	// 3E7
    
    return (0);
}

2.4 %p 포인터 출력(메모리 주소 값 출력)

포인터 변수를 출력하기 위한 서식 문자이다. 16진수로 표현하며 출력 결과의 앞에 16진수임을 나타내는 0x가 표시된다. 

#include <stdio.h>

int main(void)
{
    int		num;		// int형 변수를 선언
    int*	numPtr;		// 포인터 변수 선언
    
    num = 10;
    numPtr = &num;		//num의 메모리 주소를 포인터 변수에 저장
    printf("%p\n", pPointer);	// 포인터 변수 numPtr의 값 반환 ex)0x00238efa
    printf("%p\n", &num);	// 변수 num의 메모리 주소 반환  ex)0x00238efa
    
    return (0);
}

 

3. 플래그

  • - : 왼쪽 정렬 (기본값은 오른쪽 정렬이다.)
  • + : 양수일 때는 + 부호, 음수일 때는 - 부호 출력
  • (공백) : 음수일 때만 - 부호 출력
  • # : 진법에 맞게 숫자 앞에 0, 0x, 0X를 붙인다.
  • * : 가변 인자로 폭을 받아낸다.
  • 0 : 출력하는 폭의 남는 공간을 0으로 채워 넣는다.

 

4. 폭

  • 숫자 : 지정한 숫자만큼 폭을 지정하여 출력한다. 실수는.(소수점) , e+까지 폭에 포함된다.
  • 출력할 값이 지정한 폭보다 작으면 자릿수를 맞추기 위해 공백 또는 0을 채워 넣는다.
  • 출력 값이 지정된 폭 보다 크다면 폭은 무시된다.
  • width에 음수가 할당되면 -플래그(좌측 정렬) + width로 간주한다.
  • 폭은 * 를 이용하여 가변 인자로도 받을 수 있다.

 

5. ft_printf 구현 시 고려할 점

  • -플래그와 0 플래그가 같이 있다면 0은 무시된다.
  • 정밀도와 0플래그가 같이 있어도 0은 무시된다.
  • 설정한 폭보다 출력할 내용이 더 길다면 ? 폭은 무시된다.
  • 폭은 *를 사용하여 가변 인자로 값을 받아올 수도 있다.
  • 정밀도도 *를 사용하여 가변 인자로 값을 받아올 수 있다.
  • 정밀도와 정수를 함께 사용하면, '0'을 채워 넣어 출력된다.
728x90
반응형

댓글