off_t 및 size_t와 같은 유형을 어떻게 인쇄해야합니까?
-
06-09-2019 - |
문제
나는 같은 유형을 인쇄하려고합니다 off_t
그리고 size_t
. 올바른 자리 표시자는 무엇입니까? printf()
그것은 휴대용입니다?
아니면 이러한 변수를 인쇄하는 완전히 다른 방법이 있습니까?
해결책
당신이 사용할 수있는 z
size_t 및 t
ptrdiff_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
각각 형식.
다른 팁
인쇄 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
, 너무 작기 때문에 다른 구현에서는 실패합니다.
Microsoft의 경우 답변이 다릅니다. VS2013은 크게 C99를 준수하지만 [T] HH, J, Z 및 T 길이 접두사는 지원되지 않습니다." Size_t "즉, 32 비트 플랫폼에서 서명되지 않은 __int32, 64 비트 플랫폼에서 서명되지 않은 __int64"유형 지정자 O, U, X 또는 X와 함께 접두사 I (자본 눈)을 사용하십시오. VS2013 크기 사양을 참조하십시오
Off_t는 vc include sys type.h에서 긴 정의됩니다.
어떤 버전의 C를 사용하고 있습니까?
C90에서 표준 관행은 적절하게 서명하거나 서명되지 않은 서명되지 않은 상태로 캐스트하고 그에 따라 인쇄하는 것입니다. 나는 size_t에 대해 %z를 보았지만 Harbison과 Steele은 printf ()에서 언급하지 않으며, 어쨌든 ptrdiff_t 등을 도울 수는 없습니다.
C99에서 다양한 _t 유형은 자체 인쇄 매크로와 함께 제공되므로 "Size is " FOO " bytes."
나는 세부 사항을 모르지만, 그것은 상당히 큰 숫자 형식의 일부입니다.
inttypes.h에서 포맷 매크로를 사용하고 싶을 것입니다.
이 질문 참조 : 유형 size_t 변수에 대한 크로스 플랫폼 형식 문자열?
보고 있습니다 man 3 printf
Linux, OS X 및 OpenBSD에서 모두 지원을 보여줍니다. %z
~을 위한 size_t
그리고 %t
~을 위한 ptrdiff_t
(C99의 경우), 그러나 그 중 어느 것도 언급하지 않았습니다. off_t
. 야생의 제안은 일반적으로 %u
전환 off_t
, 내가 말할 수있는 한 "충분히 맞다"(둘 다 unsigned int
그리고 off_t
64 비트와 32 비트 시스템 사이에서 동일하게 다릅니다).
받아 들여진 답변은 나에게 기억하기 어렵 기 때문에이 게시물을 적어도 두 번 보았습니다 (거의 사용하지 않습니다. z
또는 j
깃발과 그들은 그렇지 않은 것 같습니다 플랫폼 독립).
그만큼 기준 정확한 데이터 길이를 명확하게 말하지 마십시오 size_t
, 먼저 길이를 확인해야합니다. size_t
플랫폼에서 그 중 하나를 선택하십시오.
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
그리고 나는 사용하는 것이 좋습니다 stdint
일관성을위한 원시 데이터 유형 대신 유형.
내가 기억 하듯이,이를 수행하는 유일한 휴대용 방법은 결과를 "서명되지 않은 긴 INT"에 시전하고 사용하는 것입니다. %lu
.
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
OFF_T에는 "%ZO"를 사용하십시오. 10 진수의 경우 (10 월) 또는 "%Zu".