"%. * s"는 printf에서 무엇을 의미합니까?


답변:


120

*너비 지정자 / 정밀도를 printf()형식 문자열에 하드 코딩하는 대신 별표 ( )를 사용하여 에 전달할 수 있습니다.

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}

4
주목해야한다 str_len인수 유형이 있어야합니다 int(또는 승진 될 것이다 좁은 정수형, int). 전달하는 버그 것 long, size_t
MM

10
이 코드의 가능한 목적은 특히와 함께 사용할 때 %s원래 문자열의 하위 문자열을 인쇄하는 것입니다. 이 사용 사례에서는 str원래 문자열 내부 (아마도 시작 부분)를 가리키고 str_len인쇄해야하는 하위 문자열의 길이를 지정합니다.
Sonic Atom

2
길이를 지정하면 null 종결자가없는 문자열 (예 : 스트림 또는 파일 기반 소스에서 입력 된 문자열)을 인쇄 (또는 sprintf) 할 수 있습니다. 이것은 단순히 프리틴을 인쇄하는 것보다 훨씬 더 자주 접한 사용 사례입니다.
Conrad B

23

여기에서 더 자세히 설명 합니다 .

정수 값 또는 *최소 필드 너비를 지정합니다. 결과는 필요한 경우 공백 문자 (기본적으로)로 채워지고, 오른쪽으로 정렬되면 왼쪽에, 왼쪽으로 정렬되면 오른쪽에 채워집니다. *가 사용되는 경우 너비는 int 유형의 추가 인수로 지정됩니다. 인수의 값이 음수이면-플래그가 지정되고 양의 필드 너비가 지정됩니다. (참고 : 이것은 최소 너비입니다. 값이 잘리지 않습니다.)

.그 뒤에 정수 또는 *가오고 변환 정밀도를 지정하지 않습니다. *가 사용되는 경우 정밀도는 int 유형의 추가 인수로 지정됩니다. 이 인수의 값이 음수이면 무시됩니다. 숫자도 *도 사용되지 않으면 정밀도는 0으로 간주됩니다. 정밀도의 정확한 효과는 아래 표를 참조하십시오.

따라서 두 변환 사양을 모두 시도하면

#include <stdio.h>

int main() {
    int precision = 8;
    int biggerPrecision = 16;
    const char *greetings = "Hello world";

    printf("|%.8s|\n", greetings);
    printf("|%.*s|\n", precision , greetings);
    printf("|%16s|\n", greetings);
    printf("|%*s|\n", biggerPrecision , greetings);

    return 0;
}

출력을 얻습니다.

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|

12

위의 코드가 정확하다고 생각하지 않지만 (이 설명에 따르면 printf()) .*수단

너비는 형식 문자열에 지정되지 않지만 형식화해야하는 인수 앞에 추가 정수 값 인수로 지정됩니다. '

따라서 인수로 통과 가능한 너비를 가진 문자열입니다.


2
표절 혐의를 피할 수 있도록 URL 상호 참조를 추가했습니다. 물론 정확한 인용문은 "The width is not…" 보다는 "The precision is not…" 이라고 말합니다 .
Jonathan Leffler 2015 년

@MattMcNabb가 지적했듯이 해당 페이지에 대한 모든 참조는 " 정수 값 "이 정확히 int(또는 그 하위 집합) 임을 강조해야합니다. 더 직관적 인 정수 값 size_t이나 std::string::size_type. 참조 된 페이지 size_t가 지원되는 유형 지정자 중 하나로 언급된다는 점을 고려하면 훨씬 더 혼란 스럽습니다 .
Anton Samsonov

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.