7

I have a struct that contains a string and a length:

typedef struct string {
  char* data;
  size_t len;
} string_t;

Which is all fine and dandy. But, I want to be able to output the contents of this struct using a printf-like function. data may not have a nul terminator (or have it in the wrong place), so I can't just use %s. But the %.*s specifier requires an int, while I have a size_t.

So the question now is, how can I output the string using printf?

4

3 回答 3

14

假设您的字符串中没有任何嵌入的 NUL 字符,您可以在将 转换为 后使用说明%.*s符:size_tint

string_t *s = ...;
printf("The string is: %.*s\n", (int)s->len, s->data);

这也是假设您的字符串长度小于INT_MAX. 如果你有一个比 长的字符串INT_MAX,那么你还有其他问题(打印出 20 亿个字符需要相当长的时间,一方面)。

于 2013-10-02T20:22:30.957 回答
4

一个简单的解决方案就是使用未格式化的输出:

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

于 2013-10-02T20:24:21.677 回答
1

如何使用 printf 输出字符串?

一次通话?你不能以任何有意义的方式,因为你说你可能在奇怪的地方有空终止符。一般来说,如果您的缓冲区可能包含不可打印的字符,您需要在输出字符串时弄清楚您希望如何打印(或不打印)这些字符。编写一个循环,测试每个字符,然后按照逻辑要求打印(或不打印)。

于 2013-10-02T20:15:29.163 回答