Printf可变字符串长度说明符

时间:2013-10-02 20:11:01

标签: c string

我有一个包含字符串和长度的结构:

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

哪个都很好,花花公子。但是,我希望能够使用类似printf的函数输出此结构的内容。 data可能没有nul终结符(或者它在错误的位置),所以我不能只使用%s。但是%.*s说明符需要int,而我有size_t

现在的问题是,如何使用printf输出字符串?

3 个答案:

答案 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输出字符串?

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