off_tand과 같은 유형을 인쇄하려고합니다 size_t. printf() 이식 가능한 올바른 자리 표시자는 무엇입니까 ?
아니면 변수를 인쇄하는 완전히 다른 방법이 있습니까?
off_tand과 같은 유형을 인쇄하려고합니다 size_t. printf() 이식 가능한 올바른 자리 표시자는 무엇입니까 ?
아니면 변수를 인쇄하는 완전히 다른 방법이 있습니까?
답변:
zsize_t와 tptrdiff_t에 사용할 수 있습니다 .
printf("%zu %td", size, ptrdiff);
그러나 내 맨 페이지에 따르면 일부 오래된 라이브러리는 다른 문자를 사용했으며 z사용하지 않는 것이 좋습니다. 그럼에도 불구하고 (C99 표준에 의해) 표준화되었습니다. 분들 intmax_t과 int8_t의 stdint.h또 다른 대답이 말한 것처럼 등등, 당신이 사용할 수있는 매크로이있다 :
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
이 설명서는의 맨 페이지에 나와 있습니다 inttypes.h.
개인적으로, 난 그냥에 값을 던졌다 unsigned long또는 long다른 대답은 권장처럼. C99를 사용하면 또는 형식을 각각 캐스트 unsigned long long하거나 long long사용할 수 있습니다.%llu%lld
%zda와 함께 사용 하는 size_t것은 정의되지 않은 동작 입니다. 이어야합니다 %zu.
%zd을 보지 못합니다 size_t. 실제로,의 정의 %z에 # 7의 명시 적 허용 %d하여 size_t상기 대응하는 서명 유형 및 값이 유효한 음수 값이 긴만큼 §6.2.5 # 9 명시 해당 서명 입력이 예상되는 부호 종류의 값을 사용하여 허용 서명 된 유형의
인쇄하려면 off_t:
printf("%jd\n", (intmax_t)x);
인쇄하려면 size_t:
printf("%zu\n", x);
인쇄하려면 ssize_t:
printf("%zd\n", x);
C99 표준의 7.19.6.1/7 또는 형식 코드에 대한보다 편리한 POSIX 문서를 참조하십시오.
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html
구현에서 이러한 형식 코드를 지원하지 않는 경우 (예를 들어 C89를 사용하기 때문에) AFAIK 이후 C89에는 형식 코드가 있고 정수가 큰 정수 유형이 없기 때문에 약간의 문제가 있습니다. 이 유형으로. 따라서 구현별로 무언가를 수행해야합니다.
예를 들어, 컴파일러에 long long표준 라이브러리 지원 기능이 %lld있다면이를 대신하여 사용할 수 intmax_t있습니다. 그러나 그렇지 않으면로 돌아 가야합니다 long. 너무 작기 때문에 다른 구현에서는 실패합니다.
ssize_t와 같은 크기를 가지고 size_t있으므로 진정한 휴대용 코드로 변환해야 intmax_t와 함께 인쇄 %jd단지처럼 off_t.
Microsoft의 경우 답변이 다릅니다. VS2013은 대부분 C99를 준수하지만 "[hh, j, z 및 t 길이 접두사는 지원되지 않습니다." size_t "즉, 32 비트 플랫폼의 부호없는 __int32, 64 비트 플랫폼의 부호없는 __int64"의 경우 형식 지정자 o, u, x 또는 X와 함께 접두사 I (자본 눈)을 사용 하십시오. VS2013 크기 사양을 참조하십시오.
off_t는 VC \ include \ sys \ types.h에 길게 정의되어 있습니다.
off_t항상 long32 비트가됩니다 (64 비트 Windows도 32 비트를 사용합니다 long).
어떤 버전의 C를 사용하고 있습니까?
C90에서 표준 관행은 서명 된 또는 서명되지 않은 long으로 적절하게 캐스트하고 그에 따라 인쇄하는 것입니다. size_t에 대해 % z를 보았지만 Harbison과 Steele은 printf ()에서 언급하지 않았으며 어쨌든 ptrdiff_t 또는 그 밖의 어떤 것에도 도움이되지 않습니다.
C99에서 다양한 _t 유형에는 자체 printf 매크로가 제공되므로 "Size is " FOO " bytes." 세부 사항을 알지 못하지만 상당히 큰 숫자 형식 포함 파일의 일부입니다.
inttypes.h의 포맷 매크로를 사용하고 싶을 것입니다.
이 질문을보십시오 : size_t 유형의 변수에 대한 플랫폼 간 형식 문자열?
off_t유형 (대부분의 32 비트 시스템이 일이다) 큰 파일을 지원하는 32 비트 시스템에 대한 포인터보다 크다.
보면 man 3 printf리눅스, OS X에, 모든 쇼에 대한 지원 오픈 BSD %z에 대한 size_t및 %t대한 ptrdiff_t(C99의 경우), 그러나 그 언급의 없음을 off_t. 야생의 제안은 일반적으로에 대한 %u변환을 제공합니다. off_t이는 내가 알 수있는 한 "충분히 정확합니다"( 64 비트와 32 비트 시스템 모두 동일 unsigned int하며 off_t다름).
unsigned int및 64 비트가 off_t있습니다. 따라서 캐스트로 인해 데이터가 손실 될 수 있습니다.
허용 된 답변이 나를 위해 기억하기 어렵 기 때문에이 게시물을 두 번 이상 보았습니다 (나는 거의 사용하지 z않거나 j플래그를 지정하지 않으며 플랫폼에 독립적 이지 않습니다 ).
기준은 명확하게 정확한 데이터 길이라고 결코 size_t내가 먼저 길이를 확인해야합니다 제안, 그래서 size_t다음 중 하나를 선택하여 플랫폼 :
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
그리고 stdint일관성을 위해 원시 데이터 유형 대신 유형을 사용하는 것이 좋습니다 .
%zu을 인쇄하는 데 사용할 수있는 것이 명시되어 있습니다 size_t. 하나는해야 확실히 사용에 의존 uint32_t/ uint64_t를 인쇄하는 형식 지정자를 size_t그 유형이 호환된다는 보장이 없기로.
내가 기억하는 것처럼, 그것을 할 수있는 유일한 휴대용 방법은 결과를 "signed long int"로 캐스팅하고 사용하는 것 %lu입니다.
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
long longC ++ 표준에는 존재하지 않으므로 본질적으로 이식성이 없기 때문에 문제가 발생했습니다.
fopen에서fseek, 등 을 사용하는 동안 해당 유형을 발견했다고 생각off_t합니다.