는 오래된 코드를 통해 가서 발견 :printf/snprintf 형식 문자 % N은 무엇을합니까? (안 %의 N)
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
주 만이 통과 가변 인자 매개 변수 만 3 형식 문자열을.
이
1-blah_2-blah_0
이 어떤 문서에이를 찾을 수 없습니다 인쇄합니다. % N은 무엇을합니까?
는 오래된 코드를 통해 가서 발견 :printf/snprintf 형식 문자 % N은 무엇을합니까? (안 %의 N)
char buf[...];
int i = 1, j =2;
snprintf(buf, "%d-blah_%d-blah_%N", i, j);
주 만이 통과 가변 인자 매개 변수 만 3 형식 문자열을.
이
1-blah_2-blah_0
이 어떤 문서에이를 찾을 수 없습니다 인쇄합니다. % N은 무엇을합니까?
표준 문서 (예 : POSIX printf)에 따르면 아무 것도 정의되어 있지 않으므로 (%N
은 undefined behavior 일 수 있으며 분명히 표준에서 명시되지 않은 동작 임).
그러나 GNU glibc은 customizing printf
기능을 제공합니다. 귀하의 프로그램은 register_printf_function을 (다른 곳에) %N
을 처리 할 항목으로 등록했을 수 있습니다. 이것은 표준이 아니며이며 입니다. GNU 특정 (단, 편리한 트릭이지만 GCC format
function attribute에 해당 트릭을 알릴 수는 없습니다.)
Microsoft의 CRT에서 흥미로운 사례입니다.은 크기 지정자로 처리되지만 결국에는 무시됩니다.
당신은 <VSDIR>/VC/crt/src/output.c
에서 원인을 찾을 수 VS2013에 대한 당신은 다음과 같은 라인을 찾을 수 있습니다 :
enum CHARTYPE {
...
CH_SIZE, /* 'h', 'l', 'L', 'N', 'F', 'w' */
...
};
'N'
도 조회 상태 테이블에 사용됩니다. The documentation says nothing about it 또는 'F'
을 언급하지 않습니다. 소스 코드 (case ST_SIZE
)를 더 자세히 살펴보면 'N'
, 'F'
및 'L'
(문서 임에도 불구하고!)은 작동하지 않는 크기 수정 자입니다.
따라서, 귀하의 경우 VS2013에 대한 당신은 '%의 N`도 일 0
가 후행하지 않고,
1-blah_2-blah_
을 얻을 것이라고? 나는 그것에 대한 참조를 찾는 데 어려움을 겪고있다. – tadman정의되지 않은 동작이 표시되거나 구현 관련 확장이 표시됩니다. 어떤 컴파일러를 사용하고 있습니까? –
@OliverCharlesworth 일반 제인 CentOS의 GCC. 특별한 것은 없습니다. snprintf는 stdio.h에서 오는 것 같습니다. – marathon