首页 > 解决方案 > 将 sprintf 用于多个输入的更好方法是什么?

问题描述

我有超过 50 个输入要添加到缓冲区并从中创建一个字符串。为了理解的目的,让我们说。

L1、L2、L3 是具有多个变量的结构,例如

struct L1{
int a;
int b;
int c;
};
struct L2{
int l;
int m;
};
struct L3{
int p;
int q;
int r;
int s;
};

.

sprintf(buffer, "%s,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d",time, pDeviceMO->getName(), L1.a, L1.b, L2.l, L3.q, L3.s, L2.m, L3.p, L3.r, L1.c);

比将缓冲区写入文件。

fprintf(File, "%s,%s\n",deviceSerialNum, buffer);

有没有更好的办法?

也许就像每个输入的多个 sprintf 一样。(从更好的编码角度来看)

标签: c

解决方案


没有更好的办法。前任。请参阅内核 proc 输出,例如。内存信息。您只需要遍历所有变量。

你可以有一个大电话。或链接多个调用,例如:

int pos = 0;
pos += sprintf(&buffer[pos], "%d", var1);
pos += sprintf(&buffer[pos], "%d", var2);
pos += sprintf(&buffer[pos], "%d", var3);

(没有错误检查),但无论如何你都需要检查所有变量。无论如何,我建议您使用snprintf.

如果所有变量都具有相同的类型,您可以从中获得一些乐趣:

int pos = 0;
int *list[] = { &var1, &var2, &var3, ... };
for (size_t i = 0; i < sizeof(list)/sizeof(*list); ++i) {
    pos = sprintf(&buffer[pos], "%d,", *list[i]);
}

它看起来很花哨,但实际上没有任何意义。一旦其他人开始阅读您的代码,它就会变得难以阅读并且一团糟。坚持简单snprintf


推荐阅读