在C中构建格式化字符串

时间:2013-06-04 08:45:36

标签: c string printf

假设我有很多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 个答案:

答案 0 :(得分:5)

您使用sprintf()或(更好)snprintf()

char buffer[32];

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

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

答案 1 :(得分: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;
}

答案 2 :(得分: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,但是你必须确保为你的字符串分配和释放足够的空间。

答案 3 :(得分:0)

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

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

你可以使用 sprintf 来说:

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

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

返回新字符串的指针。