2014-11-24 3 views
4

는 오래된 코드를 통해 가서 발견 :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은 무엇을합니까?

+0

가 후행하지 않고, 1-blah_2-blah_을 얻을 것이라고? 나는 그것에 대한 참조를 찾는 데 어려움을 겪고있다. – tadman

+9

정의되지 않은 동작이 표시되거나 구현 관련 확장이 표시됩니다. 어떤 컴파일러를 사용하고 있습니까? –

+0

@OliverCharlesworth 일반 제인 CentOS의 GCC. 특별한 것은 없습니다. snprintf는 stdio.h에서 오는 것 같습니다. – marathon

답변

7

표준 문서 (예 : POSIX printf)에 따르면 아무 것도 정의되어 있지 않으므로 (%Nundefined behavior 일 수 있으며 분명히 표준에서 명시되지 않은 동작 임).

그러나 GNU glibccustomizing printf 기능을 제공합니다. 귀하의 프로그램은 register_printf_function을 (다른 곳에) %N을 처리 할 항목으로 등록했을 수 있습니다. 이것은 표준이 아니며이며 입니다. GNU 특정 (단, 편리한 트릭이지만 GCC format function attribute에 해당 트릭을 알릴 수는 없습니다.)

1

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

관련 문제