簡體   English   中英

使用size_t指定C的printf中字符串的精度

[英]Using size_t for specifying the precision of a string in C's printf

我有一個結構來表示內存中的字符串,如下所示:

typedef struct {
    size_t l;
    char   *s;
} str_t;

我相信使用size_t對於指定char字符串的長度是有意義的。 我還想用printf("%.*s\\n", str.l, str.s)打印這個字符串。 但是, * precision需要一個int參數,而不是size_t 我一直無法找到與此有關的任何內容。 有沒有正確使用這種結構,沒有在printf()調用中轉換為int

printf("%.*s\n", (int)str.l, str.s)
//               ^^^^^ use a type cast

編輯

好的,我沒有正確地閱讀這個問題。 你不想使用類型轉換,但我想,在這種情況下:艱難。

或者只是使用fwrite

fwrite(str.s, str.l, 1, stdout);
printf("\n");

你可以做一個宏

#define STR2(STR) (int const){ (STR).l }, (char const*const){ (STR).s }

然后將其用作printf("%.*s\\n", STR2(str))

請注意,這會對STR兩次評估,因此請注意副作用,但您可能已經知道了。

編輯:

我正在使用復合初始值設定項,這些是隱式轉換。 如果出現問題,編譯器會向您發出警告的可能性大於使用顯式強制轉換的情況。

例如,如果STR有一個字段.l是一個指針而你只是將一個強制轉換為int ,那么所有編譯器都會很樂意將該指針轉換為int 類似於.s字段,這實際上必須對應於char*或兼容的東西,否則你會看到警告或錯誤。

不能保證size_t是int,或者它可以在int中表示。 這只是C未能定義int的確切大小的遺留問題的一部分,再加上可能需要利用size_t的實現來解決大內存區域(其中包含超過MAX_INT值的內存區域)的問題。

關於size_t的最常見錯誤是假設它等同於unsigned int。 這些舊的bug很常見,從個人經驗來看,它使得從32位架構移植到64位架構變得很麻煩,因為你需要撤消這個假設。

充其量,你可以使用演員表。 如果你真的想要擺脫演員表,你可以放棄使用size_t。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM