공백이있는 왼쪽 패드 printf


114

printf를 사용할 때 왼쪽에 공백으로 문자열을 어떻게 채울 수 있습니까?

예를 들어 앞에 40 개의 공백이있는 "Hello"를 인쇄하고 싶습니다.

또한 인쇄하려는 문자열은 여러 줄로 구성됩니다. 각 줄을 별도로 인쇄해야합니까?

편집 : 명확하게 말하면 모든 줄 앞에 정확히 40 개의 공백이 인쇄되기를 원합니다.

답변:


125

"Hello"라는 단어를 40 자 너비의 열에 인쇄하고 공백을 왼쪽에 채우려면 다음을 사용합니다.

char *ptr = "Hello";
printf("%40s\n", ptr);

그러면 35 개의 공백과 "Hello"라는 단어가 표시됩니다. 이것은 열의 너비를 알고 있지만 데이터가 변경 될 때 형식을 지정하는 방법입니다 (할 수있는 한 가지 방법입니다).

정확히 40 개의 공백을 원하고 일부 텍스트를 원하면 40 개의 공백을 상수에 저장하고 인쇄하십시오. 여러 줄을 인쇄해야하는 경우 printf위와 같은 여러 문을 사용 하거나 루프에서 수행하여 ptr매번 값을 변경합니다 .


3
형식 플래그에 대해 너무 많이 몰라요. 하지만 나는 printf ( "% 40s % s \ n", "", ptr); 40 칸으로 채워도 될까요?
Johannes Schaub-litb

예, 포인터의 내용 앞에 항상 40 개의 공백이 있습니다. 좋은 해결책이지만 많이해야한다면 40 칸의 상수가 더 빠를 것이라고 생각합니다. 컴파일러가 printf 형식을 최적화 할 수 있는지 모르겠습니다.
Bill the Lizard

38
또한 포함 할 공백 수를 포함하는 int 변수 'n'이있는 경우 다음을 사용할 수 있습니다. printf ( "% * s % s \ n", n, "", ptr); 가변 개수의 공백을 가져옵니다.
Jonathan Leffler

그리고 Q의 마지막 부분을 다루기 위해 : 예, 데이터의 각 줄을 40 개의 선행 공백으로 인쇄하려면 각 줄이 별도로 인쇄되도록 데이터를 분할해야합니다.
Jonathan Leffler

4
@Jonathan Leffler : 물론 컴파일러는 printf 형식을 최적화 할 수 있습니다. 예를 들어 GCC는 printf ( "% s \ n", foo)를 최적화하고 puts (foo)로 대체합니다.
sam hocevar

73

이 함수를 사용하여 출력을 들여 씁니다 (예 : 트리 구조 인쇄). 는 indent문자열 앞에 공간의 수입니다.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
나머지 printf 형식과 별도로 들여 쓰기를 유지하기 위해 문자열 리터럴 연결을 사용하는 것이 좋습니다. 한 가지 제안 : 들여 쓰기 문자열에 단일 공백 ​​대신 빈 문자열을 사용하십시오. 그러면 indent == 0이 예상대로 작동합니다. (즉, printf(..., indent, "", ...))
ɲeuroburɳ

Ray Hulha는 "컴파일러 문제"를 수정하기 위해 문자열 리터럴 연결을 제거했습니다.
mwfearnley

42
int space = 40;
printf("%*s", space, "Hello");

이 명령문은 40 자 행을 예약하고 행 끝에 문자열을 인쇄합니다 (총 행 길이가 40에서 일정하도록 추가 공백 제거). 다음과 같이 문자와 정수에 동일하게 사용할 수 있습니다.

printf("%*d", space, 10);
printf("%*c", space, 'x');

매개 변수를 사용하여 공백을 결정하는이 방법은 가변 개수의 공백이 필요한 경우 유용합니다. 이러한 명령문은 다음과 같이 정수 리터럴에서 계속 작동합니다.

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

이것이 미래에 저 같은 사람에게 도움이되기를 바랍니다.


내가 가지고 error: empty character constant위한 ''. 그럴까요 ' '?
Jin Kwon

예, 그래야합니다.
shjeff

@JinKwon 어떤 캐릭터 든, "Hello"뭐든 될 수 있듯이 , 그는 예를 사용 했어야했습니다
joe

18

문자열 앞에 정확히 40 개의 공백이 필요하면 다음을 수행해야합니다.

printf("                                        %s\n", myStr );

너무 더럽다면 할 수 있습니다 (하지만 40 개의 공백을 수동으로 입력하는 것보다 느립니다). printf("%40s%s", "", myStr );

문자열이 40 열에 정렬되도록하려면 (즉, 가장 오른쪽 문자가 40 열에 있도록 최대 39 개의 공백이 있어야 함) 다음을 수행하십시오. printf("%40s", myStr);

다음을 수행하여 문자열 뒤에 "최대"40 개의 공백을 넣을 수도 있습니다. printf("%-40s", myStr);


2
문자열 뒤의 공백에 대한이 주석처럼
oneat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.