[英]Printf Variable String Length Specifier
我有一個包含字符串和長度的結構:
typedef struct string {
char* data;
size_t len;
} string_t;
這一切都很好。 但是,我希望能夠使用類似printf
的函數輸出該結構的內容。 data
可能沒有 nul 終止符(或在錯誤的位置),所以我不能只使用%s
。 但是%.*s
說明符需要一個int
,而我有一個size_t
。
所以現在的問題是,如何使用printf
輸出字符串?
假設您的字符串中沒有任何嵌入的 NUL 字符,您可以在將size_t
轉換為int
后使用%.*s
說明符:
string_t *s = ...;
printf("The string is: %.*s\n", (int)s->len, s->data);
這也假設您的字符串長度小於INT_MAX
。 如果您的字符串比INT_MAX
,那么您就會遇到其他問題( INT_MAX
,打印出 20 億個字符需要很長時間)。
一個簡單的解決方案就是使用未格式化的輸出:
fwrite(x.data, 1, x.len, stdout);
for (size_t i, remaining = x.len; remaining > 0 && (i = fwrite(x.data, 1, remaining, stdout)) > 0; remaining -= i) { }
(編輯: fwrite
確實會在成功時寫入整個請求的范圍;不需要循環。)
確保x.len
不大於SIZE_T_MAX
。
如何使用 printf 輸出字符串?
一次通話? 你不能以任何有意義的方式,因為你說你可能在奇怪的地方有空終止符。 通常,如果您的緩沖區可能包含不可打印的字符,您需要弄清楚在輸出字符串時如何打印(或不打印)這些字符。 編寫一個循環,測試每個字符,然后按照您的邏輯進行打印(或不打印)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.