簡體   English   中英

Printf 可變字符串長度說明符

[英]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);
這實際上是一種糟糕的形式,因為 `fwrite` 可能不會寫出所有內容,因此應該在循環中使用它;
 
 
 
 
  
  
  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.

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