형식문자는 첫 시간에 이스케이프문자와 같이 얼추 가볍게 배웠었는데요, 그러나 표에서 나왔던 것들은 새발의 피입니다. 이번시간은 그 형식문자를 자세하고 깊게 알아보겠습니다. 이전에 남겨둔 과제1번도 같이 풀구요.
형식문자는 '%서식문자'로 간단하게 끝나는게 사실 다가 아닙니다. 형식문자를 제대로 쓰자면 아래와 같은데요.
%[플래그(flag)][폭(width)][.정밀도][크기(length)]서식문자(specifier)
다시말해서, 형식문자의 세부설정으로
플래그(=정렬이나 맨앞 공백, 부호설정), 폭(=데이터 자릿수 개수), 정밀도(=소수점뒤 자릿수 개수), 크기(=데이터 범위(세부 자료형) )를 설정해줄 수 있는 것입니다.
//형식문자 세세한 설정
하나하나 자세히 알아보자면, 플래그는 왼쪽, 오른쪽 정렬이나, 맨 앞을 부호나 0x, 공백으로 처리해주는 설정입니다.
플래그 |
설명 |
예시 |
- |
왼쪽으로 정렬해서 출력합니다. (플래그 없으면 자동 오른쪽 정렬) |
" 123"(기본값) -> "123 "(왼쪽정렬) |
+ |
데이터가 양수면 +기호를 붙입니다. (플래그 상관없이 -는 음수일 시 자동으로 붙음) |
"32" -> "+32"(양수면 + 붙음) |
(공백) |
맨 앞에 부호가 없으면 한칸을 띄웁니다. |
"6789" -> " 6789"(한칸 띄움) |
# |
%o는 0, %x는 0x, %X에서는 0X를 맨앞에 붙입니다. %e, %E, %f에서는 필수로 소수점을 붙입니다. %g, %G에서는 소수점을 필수로 붙이고 0도 붙입니다. |
"6F2" -> "0X6F2"(0X 붙음) "143" -> "143."(소수점 붙음) "143" -> "143.000000"(0도 붙음) |
0 |
정렬했을 때 빈칸은 0을 삽입합니다. (밑에서 나오는 폭에서 남는 부분을) |
" 10" -> "00010"(빈칸 0바꿈) |
그리고 다음으로 폭은 입력, 출력하는 데이터의 간격을 정해주는 설정인데요.
문자든 숫자든 입출력될 때의 간격를 정해줘서 원하는 양을 입력받거나, 입력받아놓고 버릴 수도 있습니다.
폭 |
설명 |
예시 |
(숫자) |
입출력할 최대 문자, 숫자 개수를 정해줍니다. (이 개수보다 적은 값이면 빈칸삽입으로 길이를 맞춤) |
"123" -> "123 "(남는 값만큼 비움) |
* |
입출력 데이터를 받고 무시합니다. (입력되는 stdin 데이터를 날려버림) |
scanf("%*c%c",&ch) (두번째 입력 문자를 ch에 저장) |
정밀도는 데이터를 얼마만큼 정확하게 할 것인지에 대한 설정입니다.
몇자리까지 입력, 출력할건지를 정해주며, 정수는 자리수, 실수는 소수점 아래수를 정할 수 있습니다.
폭과 구별되게 (숫자)대신 .(숫자)의 형식을 씁니다.
폭 |
설명 |
비고 |
.(숫자) |
정수(%d, %i, %o, %u, %X, %x)는 입출력될 최소 자리수를 의미합니다. (남으면 0을 채워 자리수를 맞춤, 자리수가 커도 짤리진 않음) %e, %E, %F는 소수점 이하 자리수를 의미합니다. %g, %G는 유효 숫자 수를 의미합니다. %s는 문자 최대개수를 의미하고, %c는 효과가 없습니다.
|
(정밀도의 기본값은 1이고, '.'만 있을때는 기본으로 0으로 취급합니다. |
.* |
뒤에서 값을 받아서 그것을 정밀도의 값으로 설정합니다. |
int n=3; printf("%.*f", n, m); == printf("%.3f, m); |
길이는 데이터의 범위, 다시말해서 입출력하는 데이터의 자료형을 더욱 세세하게 해줍니다.
%d가 "int형 데이터 형식"라면, %ld는 "long형 데이터 형식"이 되고, %hd라면 "short int형 데이터 형식"이 됩니다.
길이 |
설명 |
hh |
%d, %i : unsigned char %o, %u, %x, %X : unsigned char %n : signed char * |
h |
%d, %i : short int %o, %u, %x, %X : unsigned short int %n : short int * |
l |
%d, %i : long int %o, %u, %x, %X : unsigned long int %f, %F, %e, %g, %G, %a, %A : double %c : wint_t %s : wchar_t * %n : short int * %n : long int * |
ll |
%d, %i : long long int %o, %u, %x, %X : unsigned long long int %n : signed char * |
j |
%d, %i : intmax_t %o, %u, %x, %X : uintmax_t %n : intmax_t * |
z |
%d, %i : size_t %o, %u, %x, %X : size_t %n : size_t * |
t |
%d, %i : ptrdiff_t %o, %u, %x, %X : ptrdiff_t %n : ptrdiff_t * |
L |
%f, %F, %e, %g, %G, %a, %A : long double |
여기서 새로보는 형식문자도 나오는데, 그래서 새로 어려운 형식문자도 추가한 표를 만들어봤습니다.
형식문자 |
자료형 |
의미 |
%d |
int |
10진수 정수 |
%i |
||
%c |
char |
문자 |
%f |
float, double
|
고정소수점 방식 실수 (소문자) |
%F |
고정소수점 방식 실수 (대문자) |
|
%e |
부동소수점 방식 실수 (소문자) |
|
%E |
부동소수점 방식 실수 (대문자) |
|
%g |
%f, %e중 (소수점밑으로) 짧은 형식을 사용 | |
%G |
%f, %E중 (소수점밑으로) 짧은 형식을 사용 |
|
%a |
16진수 실수 (소문자) |
|
%A |
16진수 실수 (대문자) |
|
%o |
unsigned int |
8진수 정수 |
%u |
부호없는 10진수 정수 |
|
%x |
16진수 정수 (소문자) |
|
%X |
16진수 정수 (대문자) |
|
%n |
int* |
지금까지 출력한 문자 개수 |
%s |
char*(string,문자열) |
문자열 |
%p |
void* |
포인터 주소값 |
%% |
X |
%문자 자체 |
엄청나지요?
여기서 추가로 특정부분만 입출력할 수 있는 설정도 있습니다. 바로 %[] 입니다.
특정형식 설정 |
설명 |
비고 |
%[ (문자) ] |
[ ]안에 들어가는 숫자, 문자만 입력받습니다. (괄호 안과 다른 숫자나 문자가 입력되면 입력을 종료) |
%[123] : 123로된 문자열만 받음 |
%[^ (문자) ] |
[ ]안에 들어가는 숫자, 문자가 아닌것만 입력받습니다. (괄호 안의 숫자나 문자가 입력되면 입력을 종료) |
%[^\n] : 엔터 제외한 모든 문자열 받음 |
분량이 엄청나서 손수 처음부터 끝까지 정리하느라 애좀 먹었습니다;; 아무튼 이런 형식문자의 다양한 설정을 까먹지 말고 나중에 활용해봅시다!
'c언어' 카테고리의 다른 글
다양한 연산자 (0) | 2019.07.02 |
---|---|
산술연산자 응용 (0) | 2019.07.02 |
비트, 논리, 비교연산 예제 (0) | 2019.06.30 |
비트, 비교, 논리 연산자 (0) | 2019.06.30 |
산술, 대입연산 예제 (0) | 2019.06.29 |