HOWTO · C
C의 printf 함수에서 열 정렬
이 기사에서는 C의 printf 함수에서 열을 정렬하는 방법을 소개합니다.
이 페이지의 내용
C에서 printf 필드 너비를 사용해 열을 정렬할 수 있습니다. %10d는 정수를 최소 10자 너비의 필드에서 오른쪽 정렬하고, %*d는 인수에서 너비를 가져오며, %0*d는 정수 앞을 0으로 채웁니다. 표에서 텍스트를 왼쪽 정렬하려면 %-*s 또는 - 플래그를 사용하세요.
C에서 필드 너비로 출력 정렬하기
필드 너비는 값 하나를 출력하는 데 사용할 최소 문자 수를 지정합니다. 정수에 %10d를 사용하면 값이 오른쪽 정렬되고, 길이가 10자보다 짧을 때 왼쪽이 공백으로 채워집니다. 값이 더 길면 잘리지 않고 전체가 출력됩니다. 열의 끝부분을 맞추고 싶을 때 유용합니다. 변환이 오른쪽 정렬되므로 짧은 값은 더 오른쪽에서 시작합니다.
다음의 완전한 예제는 오른쪽 정렬된 값 옆에 구분자를 표시합니다.
#include <stdio.h>
int main(void) {
int values[] = {11011, 111, 11};
for (int i = 0; i < 3; ++i) {
printf("%10d | %d\n", values[i], values[i]);
}
return 0;
}
11011 | 11011
111 | 111
11 | 11
첫 번째 변환은 최소 너비 10을 확보하고, 두 번째 변환은 값의 실제 너비를 사용합니다. | 문자는 필드 경계를 보여 줍니다. 일반적으로 %10d 같은 형식의 숫자는 추가할 공백 수가 아니라 필드의 최소 전체 너비를 뜻합니다.
%*d로 동적 필드 너비 지정하기
프로그램이 실행되는 동안에야 필드 너비를 알 수 있다면 %*d를 사용하세요. 변환에서 * 하나는 해당 값 바로 앞에 있는 int 인수 하나를 소비합니다. 예를 들어 printf("%*d", width, value)에서는 width가 필드 너비를 제공하고 value가 정수를 제공합니다.
다음의 완전한 예제는 실행 중에 너비를 정하고 각 정수 값 바로 앞에 그 너비를 전달합니다.
#include <stdio.h>
int main(void) {
int width = 10;
int values[] = {11011, 111, 11};
for (int i = 0; i < 3; ++i) {
printf("%*d | %d\n", width, values[i], values[i]);
}
return 0;
}
11011 | 11011
111 | 111
11 | 11
첫 번째 변환은 width 값을 최소 필드 너비로 사용합니다. 따라서 짧은 정수 앞에는 공백이 들어가고, 더 긴 값은 그대로 출력됩니다. 두 번째 변환은 같은 정수를 실제 너비로 출력합니다.
- 플래그는 값을 왼쪽 정렬합니다. 이 플래그는 %-*d처럼 동적 너비와 함께 쓸 수 있으며, 너비 인수는 값 인수보다 먼저 와야 합니다. 예를 들어 printf("%*d | %-*d\n", width, value, width, value)는 각 정수 앞에 해당하는 width를 전달합니다. 기본적으로 첫 번째 필드는 오른쪽 정렬되고 두 번째 필드는 왼쪽 정렬됩니다. 행마다 배치가 달라진다면 각 값 앞에 다른 너비를 전달하면 됩니다.
필드 너비를 조합해 표 열 정렬하기
텍스트와 숫자가 섞인 표에서는 각 필드에 해당 열에 맞는 너비를 지정하세요. - 플래그는 레이블을 왼쪽 정렬하고, 플래그가 없는 정수 변환은 숫자를 오른쪽 정렬합니다. | 구분자는 열을 나눕니다. %*.*d에서는 첫 번째 *가 너비를, 두 번째 *가 정밀도를 소비하고 마지막 인수가 정수 값이 됩니다. 정수 정밀도는 최소 자릿수를 정하며, 필요한 경우 앞에 0을 붙입니다.
다음의 완전한 표 예제는 머리글과 샘플 행에 고정 너비 열을 사용합니다. 펜스 안의 코드와 출력은 원문 그대로 유지되므로, 예제에 포함된 표 레이블이 있다면 영어로 표시됩니다.
#include <stdio.h>
int main(void) {
int width = 12;
printf("%-*s | %-*s | %*s\n", width, "Number", width,
"Description", width, "Value");
printf("%-*d | %-*s | %*.*d\n", width, 123, width, "First",
width, 4, 4567);
printf("%-*d | %-*s | %*.*d\n", width, 456, width, "Second",
width, 4, 789);
return 0;
}
Number | Description | Value
123 | First | 4567
456 | Second | 0789
여기서는 행을 빠르게 훑어볼 수 있도록 숫자와 설명 열을 왼쪽 정렬했습니다. 숫자 열을 오른쪽 정렬하려면 정수 변환에서 -를 제거하세요. *로 지정하는 각 너비나 정밀도에는 같은 순서로 대응하는 int 인수가 있어야 합니다. 멀티바이트 문자나 폭이 넓은 문자가 포함된 텍스트는 터미널에서 차지하는 표시 너비가 다를 수 있으므로, 이 바이트 기준 예제는 일반 ASCII 텍스트를 사용합니다.
%0*d로 정수를 0으로 채우기
정수에 최소 너비를 지정하고 앞을 0으로 채우려면 %0*d를 사용하세요. *는 정수 값보다 먼저 오는 너비 인수를 소비합니다. %*d의 공백 채우기와 달리 0 채우기를 사용하면 숫자 식별자와 개수를 일정한 자릿수 너비로 표시할 수 있습니다.
다음의 완전한 예제는 정수 두 개를 최소 5자리 너비로 출력합니다.
#include <stdio.h>
int main(void) {
int width = 5;
printf("%0*d\n", width, 123);
printf("%0*d\n", width, 7);
return 0;
}
00123
00007
너비는 최소값이므로 정한 너비보다 자릿수가 많은 값도 전체가 출력됩니다. 표에서는 각 행에 같은 숫자 너비를 적용하고, 머리글이나 텍스트에는 공백으로 채우는 필드를 사용하세요.
결론
레이아웃이 정해져 있다면 %10d나 다른 고정 필드 너비를 선택하세요. 너비를 변수에서 가져오려면 %*d를 사용하고, 필드를 왼쪽 정렬하려면 -를 추가하세요. 숫자 식별자나 개수 앞에 0이 필요하면 %0*d를 사용하면 됩니다. 이러한 형식 지정은 일반 ASCII 콘솔 출력을 읽기 쉽게 해 줍니다. 다른 텍스트의 정렬은 터미널에서 표시되는 너비에 따라 달라질 수 있습니다.