Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言构建格式化字符串_C_String_Printf - Fatal编程技术网

用C语言构建格式化字符串

用C语言构建格式化字符串,c,string,printf,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中,我会使用StringBuil

假设我有很多
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中如何做到这一点?

您使用
sprintf()
,或者(更好)


我跳过了
\u条件
变量访问,因为该行没有进行任何格式设置。

正如建议的那样,
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;
}
#包括
#包括
int main(){
char-buf[256];
int s=sprintf(buf,“这个%d,”,12);
s+=sprintf(buf+s,“这个%f.”,1.0);
s+=sprintf(buf+s“,也称为%f”,2.0);
printf(“%s\n”,buf);
返回0;
}

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

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

您可以使用sprintf比方说:

sprintf(newstring, "%s%s", string, chunk);
然后释放最后两个字符串(如果手动分配)


返回新字符串的指针。

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

printf("%d,IS REAL,%f,%d,\r\n", _counter, _value, _time);
注意,我推荐了这个:

printf("IS REAL,", _condition);
因为您将它作为一个参数,但是没有为它指定格式,只是纯文本,所以它是错误的。如果要将
\u条件
打印为值,则还必须添加格式说明符,如
%d
或任何
\u条件
是什么。如果是布尔值,则可以执行以下操作:

printf(""%s,",  (_condition == 1) ? "IS REAL" : "IS NOT");
但我不知道你的代码,所以这只是一个建议,假设你想这样做


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

你在调用
snprintf
时忘记了
大小
,谢谢,修复了!这在实际代码中可能永远不会发生。:)
printf(""%s,",  (_condition == 1) ? "IS REAL" : "IS NOT");