假设我有很多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中执行此操作?
答案 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);
然后释放最后两个字符串,如果你手动分配它们。
返回新字符串的指针。