[C언어] 출력 형식(format) 총정리 (Feat. sprintf, fprintf) - 일정한 간격으로 문자열 출력 예제 까지
C언어의 다양한 출력 문자들
C언어에서 다양한 출력 형식을 지원합니다. 우리가 너무나 잘 알고 있는 부호있는 정수형은 %d, 문자열 출력은 %s 등이 그 출력형식인데요. 오늘은 자세하게 한번 총 정리하는 포스팅을 정리하도록 하겠습니다. 마지막에는 단순 화면에 출력하는 것이 아닌 변수에 저장하는 방법, 파일에 출력하는 방법을 알아보도록 하겠습니다. 더불어 이 형식들과 소개한 함수를 이용해서 ls가 출력하는 형식처럼 일정한 간격으로 보기 좋게 문자열을 출력하는 방법도 소개합니다.
출력 문자(Format Character)
출력 형식 | 설명 | 예 | 출력 예 |
%d | 우리가 흔히 알고 있는 부호 있는 정수형을 출력해줍니다. | printf("%d",-150); | -150 |
%c | 문자열 하나를 출력해줍니다. | printf("%c",'A'); | A |
%p | 주로 주소를 출력합니다. 메모리 크기만큼 자릿수가 채워집니다. 출력될때는 16진수로 표시됩니다. | int a; printf("%p",&a); |
0177F95C |
%x | 정수를 16진수로 출력합니다. %x를 보시면 소문자인데, 16진수로 표시될때 알파벳은 소문자로 표시됩니다. | printf("%x",10); | a |
%X | 위의 %x와 동일하나 알파벳이 대문자로 표시됩니다. | printf("%X",10); | A |
%o | 8진수로 출력합니다. | printf("%o", 8888); | 21270 |
%s | 문자열을 출력합니다. '\0'인 NULL문자를 만날때까지 출력이 됩니다. | printf("%s","hello, world"); | hello, world |
%u | 부호없는 정수 출력입니다. 즉, 양수를 출력하는 포맷입니다. signed bit을 정수 데이터로 취급한다는 것이죠. 만약 -1이라는 정수가 2의 보수를 거치는 과정은 이렇습니다. 0000 0000 0000 0000 0000 0000 0000 0001 -> 1111 1111 1111 1111 1111 1111 1111 1110 + 1-> 1111 1111 1111 1111 1111 1111 1111 1111 = 4294967295 이 되죠. 부호가 있다면 -1이지만 부호없으면 4294967295라고 이렇게 표시가 된다는 뜻이에요. | printf("%u",1); printf("%u",-1); |
1 4294967295 |
%ld | 부호있는 long 형 정수 출력입니다. | printf("%ld", 1L); | 1 |
%lld | 부호있는 long long 형 정수 출력입니다. | printf("%lld", 5294967295); | 5294967295 |
%lu | 부호없는 long 형 정수 출력입니다. | printf("%lu", -12345); | 4294954951 |
%llu | 부호없는 long long 형 정수 출력입니다. | printf("%llu",-12345); | 18876570244468679 |
%f, %lf | 두 개 모두 실수형을 출력합니다. 6자리까지 출력이 되면 그 이하는 반올림처리됩니다. 모자라면 0으로 채웁니다. 출력할때는 상관없지만 입력 받을때는 float 자료형에 넣을시 %f, double에 입력받을때는 %lf를 사용합니다. |
float f; double d; scanf("%f",&f); scanf("%lf",&d); -------------------------- printf("%f",0.1234f); printf("%f",0.1234567f); |
0.123400 0.1234567 |
%e | 실수를 지수 표기법으로 소문자로 표시합니다. | printf("%e", 0.11223344f); | 1.122334e-01 |
%E | 실수를 지수 표기법으로 표시할때 대문자를 사용합니다. | printf("%E", 0.11223344f); | 1.122334E-01 |
형식 정렬 (Format Alignment)
'%' 문자와 포맷 문자(d, x, u 등) 사이에 부호와 숫자를 넣을 수 있는데, 숫자는 공간을 의미합니다. 만약 공간이 남으면 빈 자리 만큼 공백이 생깁니다. 이때 하고 부호('-')가 있으면 왼쪽 정렬, 아니면 오른쪽 정렬입니다. 예를 보면서 확인하세요.
출력 형식 | 출력 | 설명 |
printf("%-4d, %d, %4d", 10,11,12); | 10 , 11, 12 | 4자리 공간을 확보하며 10은 왼쪽 정렬, 12는 오른쪽 정렬을 하여 출력하니다. |
printf("%-4d, %d, %4d", 10000,11000,12000); | 10000, 11000, 12000 | 4자리를 넘어갈 경우 일반 출력과 같습니다. |
printf("%8x",0xFFEE) | ffee | 8자리 확보하고 오른쪽 정렬합니다. |
printf("%08x",0xFFEE) | 0000ffee | 8자리를 확보하고 빈 공간은 0으로 채웁니다. |
printf("%02x %02x %02x", 0xE, 0xF1, 0xDEAD); | 0e f1 dead | 2자리를 확보합니다. 빈자리는 0으로 채우고 넘는다면 일반 출력과 같습니다. |
printf("%.3f", 3.14f); printf("%.3f", 3.141592f); |
3,14 3.142 |
소수점 이하 3자리까지 출력합니다. 자리수가 넘어가지 않을 경우 0으로 채우며 넘어가면 3자리에서 반올림하여 출력합니다. |
printf("%10.3f", 3.14f); | 3.140 | 10자리 확보한 이후 수를 오른쪽 정렬로 출력합니다. -는 왼쪽 정렬이겠죠? |
printf("%10s", "reakwon"); | reakwon | 10자리 확보 후 오른쪽 정렬로 문자열을 출력합니다. |
n진수 문자 포함 출력
8진수나 16진수일때 n진수 문자를 앞에 표기할때 문자 '#'을 사용합니다. 여기서는 16진수만 예를 들어보겠습니다.
출력 형식 | 출력 | 설명 |
printf("%#x", 0xFF11); | 0xff11 | 16진수 표기법인 0x까지 출력합니다. |
%기호를 자체 출력
%는 정말 문자 그대로 출력하려면 %% 두번쓰면 됩니다.
출력 형식 | 출력 | 설명 |
printf("%%JAVA_HOME%%bin"); | %JAVA_HOME%bin | %를 문자로 출력했습니다. %%를 사용하였죠. |
우리는 단순히 화면에 출력했었죠? 하지만 가끔 프로그래밍을 하다가 보면 화면에 출력하는 방식이 아닌 변수에 담거나, 파일에 직접써야하는 일이 생깁니다. 그럴때 유용한 함수들이 존재하는데 여기서 알아볼 함수는 sprintf와 fprintf입니다.
sprintf - 문자 배열에 형식 문자열 write
만약 콘솔에 출력하는 대신 일반 문자열에 저장하려면 어떻게 할까요? 이런 기능을 맡는 함수가 sprintf 함수입니다. sprintf의 첫 인수는 저장할 문자 버퍼(문자 배열), 두번째는 포맷 문자열, 세번째는 형식에 대응되는 데이터들입니다.
char str[128];
sprintf(str, "%d + %d = %d", 10, 20, 10 + 20);
printf("%s\n", str);
10 + 20 = 30
sprintf 예제 ) 문자열을 일정한 간격으로 출력
리눅스 ls명령을 보면 신기하게도 문자열을 고른 간격으로 출력하는 것을 볼 수 있죠. 신기하지 않았나요? 나만 그런가.. 여기서 sprintf를 사용하여 흉내낼 수 있습니다.
어떻게 흉내낼까요? 아래의 코드가 흉내내는 코드입니다. 설명은 주석으로 충분할 것 같습니다.
#include <stdio.h>
#include <string.h>
int main() {
int i;
char name[][100] = { "reakwon","kim","john","lee","yu","loooooooooooooooong","hello!","good!" };
char format[128]; //출력 형식을 담을 문자열
int longest = 0; //가장 긴 문자열의 길이
for (i = 0; i < 8; i++) {
int len = strlen(name[i]);
if (len > longest)
longest = len;
}
// '%' + '-' + %u = longest+3] + s -> %-[longest+3]s : 왼쪽 정렬된 문자 공간 longest+3 자리 확보
sprintf(format, "%%-%us", longest+3);
for (i = 0; i < 8; i++) {
if (i != 0 && i % 2 == 0) printf("\n");
printf(format, name[i]);
}
}
fprintf - 파일에 형식 문자열 출력
콘솔에 출력하는게 아니라 파일에 출력하려면 fprintf함수를 사용하면 됩니다. sprintf와 사용법은 거의 비슷한데 첫 인자를 파일로 지정하면 됩니다. 어려운것은 없죠?
FILE* fp = fopen("file.txt", "w");
fprintf(fp, "%s, %s", "reakwon", "tistory");
fclose(fp);
여기까지 C언어에서 지원하는 출력 형식(format)을 알아보았고 콘솔에 출력하지 않고 문자 배열에 저장하는 함수인 sprintf와 파일에 출력해주는 유용한 함수 fprintf에 대해서 알아보았습니다. 유용한 함수이고 어려운 것은 없으니 기억해두셔서 적재적소에 쓰시면 되겠습니다.