c - 将 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 一样。(从更好的编码角度来看)
解决方案
没有更好的办法。前任。请参阅内核 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
。
推荐阅读
- c - c语言结果在Windows 10中有所不同
- reactjs - 如何在 reactjs 中直接访问特定产品?
- macos - 在 MacOS 上构建 SwiftUI “Hello World”
- replace - 在 PhpStorm 中替换正则表达式匹配部分的函数
- css - 模态中 npm 包中的 React datepicker 与引导程序的 css 不匹配
- java - 无法在 Ubuntu 上启动 Hive
- html - 如何在弹性框中的元素周围创建边框
- python - 正则表达式 - 替换括号内的点
- python - Networkx:绘制平行边
- javascript - 如何使用 lodash 进行数据格式化