답변:
*
너비 지정자 / 정밀도를 printf()
형식 문자열에 하드 코딩하는 대신 별표 ( )를 사용하여 에 전달할 수 있습니다.
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
인수 유형이 있어야합니다 int
(또는 승진 될 것이다 좁은 정수형, int
). 전달하는 버그 것 long
, size_t
등
%s
원래 문자열의 하위 문자열을 인쇄하는 것입니다. 이 사용 사례에서는 str
원래 문자열 내부 (아마도 시작 부분)를 가리키고 str_len
인쇄해야하는 하위 문자열의 길이를 지정합니다.
정수 값 또는
*
최소 필드 너비를 지정합니다. 결과는 필요한 경우 공백 문자 (기본적으로)로 채워지고, 오른쪽으로 정렬되면 왼쪽에, 왼쪽으로 정렬되면 오른쪽에 채워집니다. *가 사용되는 경우 너비는 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|
위의 코드가 정확하다고 생각하지 않지만 (이 설명에 따르면 printf()
) .*
수단
너비는 형식 문자열에 지정되지 않지만 형식화해야하는 인수 앞에 추가 정수 값 인수로 지정됩니다. '
따라서 인수로 통과 가능한 너비를 가진 문자열입니다.
int
(또는 그 하위 집합) 임을 강조해야합니다. 더 직관적 인 정수 값 size_t
이나 std::string::size_type
. 참조 된 페이지 size_t
가 지원되는 유형 지정자 중 하나로 언급된다는 점을 고려하면 훨씬 더 혼란 스럽습니다 .
참조 : http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
정밀도는 형식 문자열에 지정되지 않지만 형식화해야하는 인수 앞에 추가 정수 값 인수로 지정됩니다.
s
문자열
printf
호출 이 아닙니다 .