2013-10-04 6 views
4

누구나 ino_t 유형의 자리 표시자를 아는 사람이 있습니까? printf를 사용하여 인쇄를 시도하고 % d, % i, % s 등을 시도했지만 작동하지 않았습니다.ino_t의 자리 표시 자

printf(" file name = %s, i-node number=**%d**\n", direntp->d_name, direntp->d_ino); 

warning: format ‘%i’ expects argument of type ‘int’, but argument 3 has type ‘__ino_t’ [-Wformat] 

다른 코드가 올바른 것으로 가정합니다. 대부분의 예제는 이름을 인쇄하는 방법 만 보여 주지만 inode 번호는 표시하지 않습니다. 여러 장소를 검색했습니다. 사전

+0

http://stackoverflow.com/questions/18534336/does-posix-supply-format-string-macros-for-printf-scanf – szx

답변

8

에서

감사합니다 당신이 유형은 필수입니다 알고 있다면, 당신은 unsigned long long에 캐스팅, 그리고 %llu를 사용할 수 있습니다.

printf(" file name = %s, i-node number=%llu\n", 
     direntp->d_name, (unsigned long long)direntp->d_ino); 
+0

예. 나는 거의 똑같은 대답을했다. 단어 단어별로. 바로 그 때. :) –

7

"변환 지정자"라고합니다.

내가 아는 한 ino_t에 대한 변환 지정자가 없습니다. 정수라고 확신되면 unsigned long long으로 캐스팅하고 "%llu"을 사용하십시오.

+1

물론 +1, 내 자신의 대답을 upvote 많은 기회를 얻지 않기 때문에. ;-) – jxh

+0

@jxh 같은 이유로. 매우 드물게 발생합니다 :) –

+0

그러나 가장 안전한 방법은 ['stdint.h'] (http://pubs.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html)에서'intmax_t'를 사용하고' PRIdMAX'에서 ['inttypes.h'] (http://pubs.opengroup.org/onlinepubs/000095399/basedefs/inttypes.h.html)를 참조하십시오. IOW,'printf ("ino = %"PRIdMAX "\ n", (intmax_t) direntp-> d_ino);'. 아니면, 아마도 서명되지 않았기 때문에'printf ("ino = %"PRIuMAX "\ n", (uintmax_t) direntp-> d_ino);'. – glglgl

-1

ino_t는 unsigned long에 typedef입니다. 그래서 같은 것을 인쇄하는 한정자는 % lu입니다.

+3

모든 플랫폼에서 그렇습니까? –

+0

감사합니다. 잘 작동합니다. – Newbie

+1

나는 32 비트'long's과 64 비트 inums를 가진 시스템이 있다고 확신한다. 그래서 당신의 대답은 틀 렸습니다. – glglgl