如何修改我的C代码,以便printf的所有调用都将参数字符串写入一个大字符数组?
答案 0 :(得分:2)
有两种方法可以实现这一目标:
不太通用 - 使用sprintf
指向下一个字符位置的指针
更通用:将fprintf
与变量文件指针一起使用。常规IO可以是stdout
,也可以是fmemopen
打开的流。请参阅GNU C库中的memory streams。
答案 1 :(得分:1)
你的意思是:
char buf[N];
sprintf(&buf[0], "%d ", i);
sprintf(&buf[strlen(buf)], "%f ", f);
等?
答案 2 :(得分:0)
您可以通过实施默认printf()
来覆盖默认stdio.h
,并排除#define printf(...) override_printf(__VA_ARGS__)
,这会使事情变得非常困难。
另一种解决方案是编写像
这样的宏override_printf()
困难的部分正在实施#include <stdio.h>
#include <stdlib.h>
#define printf(...) fprintf(stream, __VA_ARGS__)
int main(void)
{
FILE *stream;
char *content;
size_t length;
length = 0;
stream = open_memstream(&content, &length);
if (stream == NULL)
return -1;
printf("Hello World!\n");
printf("Just writing some text\n");
/* Don't forget to `fclose()` the stream before using the poitner */
fclose(stream);
fprintf(stdout, "size: %zu\ncontent:\n%s\n", length, content);
free(content);
return 0;
}
,但它比以前的解决方案容易得多,现在如果你可以使用 glibc 特定的 1 open_memstream()
,那么这个解决方案很简单
{{1}}
1 手册页声称它可能在其他系统上可用,但它并没有广泛使用。