2

假设我有很多printf用法,但我想将它们存储在一个字符串中并一次性打印它们。想象一下下面的情况:

printf("%d,", _counter);
printf("IS REAL,", _condition);
printf("%f,", _value);
printf("%d,\r\n", _time);

我想要做的是构建一个字符串,并且printf当我确定我想在屏幕上打印它时只使用一次。例如上面代码的输出将是:

1,IS REAL,663,1044

在 C# 中我会使用StringBuilder....但是如何在 C 中做到这一点?

4

4 回答 4

6

你使用sprintf(), 或(好多了)snprintf()

char buffer[32];

snprintf(buffer, sizeof buffer, "%d,IS REAL,%f,%d\r\n", _counter, _value, _time);
printf("%s", buffer);

我跳过了_condition变量访问,因为该行没有进行任何格式化。

于 2013-06-04T08:46:13.653 回答
3

正如建议的那样,sprintf我相信你要问的是什么,但是,你总是可以这样做:

printf("%d, IS REAL(%d), %f, %d,\r\n", _counter, _condition, _value,  _time);

并且 sprintf 返回写入的字符数,因此您可以像这样使用它:

#include <stdio.h>
#include <string.h>
int main() {
    char buf[256];
    int s = sprintf(buf, "This %d,", 12);
    s += sprintf(buf+s, "and this %f.", 1.0);
    s += sprintf(buf+s, ",also  %f", 2.0);
    printf("%s\n", buf);
    return 0;
}
于 2013-06-04T08:48:18.053 回答
1

要回答您的问题,您可以根据需要添加任意数量的格式化程序或字符串。

printf("%d,IS REAL,%f,%d,\r\n", _counter, _value, _time);

请注意,我省略了这个:

printf("IS REAL,", _condition);

因为你将它作为一个参数,但没有为它指定格式,只是纯文本,所以它是错误的。如果您想_condition作为值打印,那么您还必须添加一个格式说明符,例如%d或其他任何_condition内容。如果它是一个布尔值,你可以这样做:

printf(""%s,",  (_condition == 1) ? "IS REAL" : "IS NOT");

但我不知道你的代码,所以这只是一个建议,假设你想要完成这样的事情。

如果你想在内存中构建一个字符串,首先收集所有数据,你必须使用s(n)printf,但是你必须确保为你的字符串分配和释放足够的空间。

于 2013-06-04T08:50:59.383 回答
0

创建一个函数,将当前字符串和要插入的块作为参数,

然后在 char 上分配一个新指针,长度等于(strlen(string) + strlen(chunk) + 1)

你可以使用sprintf让我们说:

sprintf(newstring, "%s%s", string, chunk);

如果您手动分配它们,则释放最后两个字符串。

返回新字符串的指针。

于 2013-06-04T08:49:06.950 回答