我有一个包含字符串和长度的结构:
typedef struct string {
char* data;
size_t len;
} string_t;
哪个都很好,花花公子。但是,我希望能够使用类似printf
的函数输出此结构的内容。 data
可能没有nul终结符(或者它在错误的位置),所以我不能只使用%s
。但是%.*s
说明符需要int
,而我有size_t
。
现在的问题是,如何使用printf
输出字符串?
答案 0 :(得分:13)
假设您的字符串中没有任何嵌入的NUL字符,您可以在将%.*s
转换为size_t
之后使用int
说明符:
string_t *s = ...;
printf("The string is: %.*s\n", (int)s->len, s->data);
这也假设您的字符串长度小于INT_MAX
。如果你的字符串长于INT_MAX
,那么你还有其他问题(打印出20亿个字符需要花费很长时间)。
答案 1 :(得分:3)
一个简单的解决方案就是使用 unformatted 输出:
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) {
}
确保x.len
不大于SIZE_T_MAX
。
答案 2 :(得分:1)
如何使用printf输出字符串?
一次通话?你不能以任何有意义的方式,因为你说你可能在奇怪的地方有空终结器。通常,如果缓冲区可能包含不可打印的字符,则在输出字符串时,您需要弄清楚如何打印(或不打印)这些字符。写一个循环,测试每个字符,然后按照你的逻辑要求打印它(或不打印)。