언어/C언어

[C언어] 출력 형식(format) 총정리 (Feat. sprintf, fprintf) - 일정한 간격으로 문자열 출력 예제 까지

REAKWON 2021. 4. 15. 21:41

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);

 

fprintf 사용법

 

여기까지 C언어에서 지원하는 출력 형식(format)을 알아보았고 콘솔에 출력하지 않고 문자 배열에 저장하는 함수인 sprintf와 파일에 출력해주는 유용한 함수 fprintf에 대해서 알아보았습니다. 유용한 함수이고 어려운 것은 없으니 기억해두셔서 적재적소에 쓰시면 되겠습니다.

반응형