printf ()를 사용하여 문자열을 형식화하여 출력에서 ​​동일한 길이를 얻는 방법은 무엇입니까?


97

I는 두 가지 기능 등을 생성 한 메시지가 Starting initialization...와 검사 코드 및 출력을 리턴하는 다른 "Ok", "Warning"또는 "Error". 그러나 생성되는 출력은 길이가 다릅니다.

Starting initialization...Ok.
Checking init scripts...Ok.

다음과 같은 것을 어떻게 얻을 수 있습니까?

Starting initialization...       Ok.
Checking init scripts...         Ok.

답변:


164

문자열 필드에 너비를 지정할 수 있습니다.

printf("%-20s", "initialization...");

그런 다음 해당 필드로 인쇄되는 모든 항목은 사용자가 지정한 너비만큼 공백으로 채워집니다.

-해당 필드에 텍스트를 왼쪽에 맞.


130
아아, 나는 그렇게 높은 것을 셀만큼 영리하지 않다. 그러나, 나는 :) 내 예로부터 외삽 지능형 충분하기 위해 아스 커 신뢰
칼 Smotricz

3
정당한 것은 어떻습니까? K & R에서 언급 된 모든 플래그가 없습니다
Ungeheuer

9
오른쪽 정렬이 기본값입니다. 가 없으면 -너비를 지정한 필드에서 데이터가 오른쪽 정렬됩니다.
Carl Smotricz 2017

25

printf너비 지정자를 사용하여 서식을 지정할 수 있습니다. 예 :


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

기본값은 오른쪽 정렬을 사용하는 것이기 때문에 음의 너비 지정자를 사용하여 왼쪽 정렬을 나타냅니다.


20

또한를 선택하는 유연성을 원하면 width다음 두 형식 (잘림 포함 또는 제외) 중 하나를 선택할 수 있습니다.

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

13

%n특정 상황에서 도움이 될 수 있는 수식어 도 있습니다. 지금까지 문자열이 있던 열을 반환합니다. 예 : 표처럼 첫 번째 행의 너비 내에있는 여러 행을 작성하려고합니다.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

어떤 길이 두 문자열의 동일한 폭의 2 열을 인쇄 할 header1header2있을 수 있습니다. 모든 구현에 %nSolaris와 Linux가 있는지는 모르겠습니다 .


이 솔루션은 효과가 있지만이 솔루션을 사용하여 코드에 넣는 사람은 메모리 취약성을 도입위험을 알고 있어야 합니다 .
마태 복음 콜

0

메시지를 정렬하기 위해 손으로 공백을 추가하는 다소 낮은 기술 솔루션도 있습니다. 메시지 문자열에 몇 개의 후행 공백을 포함하는 것을 방해하는 것은 없습니다.


-2

\ t 문자 수정자인 탭을 사용하여 시작하십시오 . 고정 된 위치 (열, 터미널 용어)로 진행됩니다. 그러나 열 너비보다 큰 차이가 있으면 도움이되지 않습니다 (올바르게 기억하면 4 자).

이 문제를 해결하려면 고정 된 수의 탭 (5? 6 ?, 시도)을 사용하여 "OK / NOK"항목을 작성한 다음 줄 바꿈 없이 리턴 ( \ r )하고 메시지를 작성하십시오.


5
문자열이 탭 정지보다 길어서 결과 탭과 텍스트가 잘못 정렬 될 위험이 항상 있습니다.
PP.

별로 ... 먼저 OK / NOK 탭을 쓴 다음 / r, 이제 구문을 작성하십시오. 이제 / n. 이 문구는 OK / NOK를 덮어 쓸 수 있습니다. 하지만 당신의 방식이 훨씬 낫습니다. 저는 부정적인 정당화에 대해 몰랐습니다.
jpinto3912
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.