문제

나는 같은 유형을 인쇄하려고합니다 off_t 그리고 size_t. 올바른 자리 표시자는 무엇입니까? printf() 그것은 휴대용입니다?

아니면 이러한 변수를 인쇄하는 완전히 다른 방법이 있습니까?

도움이 되었습니까?

해결책

당신이 사용할 수있는 z size_t 및 t ptrdiff_t와 같은 경우

printf("%zu %td", size, ptrdiff);

그러나 내 인력은 일부 오래된 도서관은 z 그리고 그것을 사용하지 않습니다. 그럼에도 불구하고 (C99 표준에 의해) 표준화되었습니다. 그것들을 위해 intmax_t 그리고 int8_tstdint.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".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top