2013-03-01 78 views
4
int lsdetails(struct stat *astatbuff) { 
    printf("%d", astatbuff->st_size); 
    printf("%d", astatbuff->st_atime); 
    printf("%s\n", getpwuid(astatbuff->st_uid)->pw_name); 

    return 0; 
    } 

警告:格式 '%d' 期望類型的 'INT' 參數,但參數2具有輸入 '__off_t'[-Wformat]printf(「%d」,astatbuff-> st_size)的C格式問題;

我接收到的上述錯誤信息,但我不理解爲什麼。我的印象是,我只通過st_sizest_atime兩個參數。

+1

這有幫助嗎? http://stackoverflow.com/questions/586928/how-should-i-print-types-like-off-t-and-size-t – 2013-03-01 20:40:09

回答

5

不同於C,它開始於0(數組元素計數:-),GCC開始所以在printf (fmt, value)處第1計數功能參數,「參數1」將是指fmt,和「參數2」是指value。很簡單,不是嗎?

至於正確的整數類型printf __off_t,目前沒有100%保證和便攜的方式。你最好的選擇是將它轉換爲你實現支持的最寬的無符號類型。請注意,unsigned long可能只有32位寬,您會遇到文件> = 4GB的問題。如果你有一個C99實現,或者如果它支持unsigned long long,你應該罰款與

printf("%llu", (unsigned long long)astatbuff->st_size); 

有當前POSIX標準化小組的討論提供更多的printf()格式說明符匹配其他POSIX類型,如off_tpid_t等等。一旦出門(不要屏住呼吸),打印文件的大小會更便攜和優雅。

3

我收到了abover錯誤消息,但我不明白爲什麼。我的印象是,我只通過st_sizest_atime兩個參數。

但你傳遞兩個參數來printf

  1. 格式字符串
  2. 結構體成員

第二個參數是__off_t型的,但格式爲int參數。 __off_t的正確格式是什麼,我不知道,%ld%zd有一個很好的機會是正確的,但爲了安全起見,投到intmax_t並使用%jd

+0

'%zu'似乎是更便攜的解決方案 – hwatkins 2013-03-01 20:48:26

+1

它不是;這在32位系統上是錯誤的。您必須將off_t轉換爲像long long或intmax_t這樣的已知類型才能打印。 – 2013-03-01 21:49:48