Каков лучший способ использовать sprintf для нескольких входов? - PullRequest
0 голосов
/ 09 января 2019

У меня более 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 для каждого входа. (с лучшей точки зрения кодирования)

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Нет лучшего способа. Ex. смотрите вывод proc ядра, ex. MemInfo . Вам просто нужно , чтобы пройти все переменные.

Вы можете иметь один большой звонок . Или цепочка нескольких звонков, как:

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.

0 голосов
/ 09 января 2019

Если разделение одиночного sprintf на 50 переменных является единственной проблемой, то вы можете использовать несколько вызовов sprintf и использовать возвращаемое значение для вычисления позиции буфера для следующей части.

непроверенный пример

int chars;
int pos = 0;

chars = sprintf(buffer+pos, "%s", one);
if(chars > 0) pos += chars;

chars = sprintf(buffer+pos, ",%s", two);
if(chars > 0) pos += chars;

chars = sprintf(buffer+pos, ",%d", three);
if(chars > 0) pos += chars;

...

Конечно, вы можете использовать более одного значения для sprintf

chars = sprintf(buffer+pos, "%s,%s,%d", one, two, three);
if(chars > 0) pos += chars;

Обратите внимание, что код не предотвращает возможное переполнение буфера. Вы можете использовать snprintf, чтобы исправить это, но с snprintf код возврата немного сложнее обрабатывать.

Если все, что вы хотите сделать с объединенным буфером, - это записать его в файл, вы можете напрямую fprintf отдельные значения, чтобы избежать возможной проблемы переполнения буфера.

fprintf(File, "%s,",deviceSerialNum);
fprintf(File, "%s,", one);
fprintf(File, "%s,", two);
fprintf(File, "%d,", three);
/* ... */
fprintf(File, "%d\n", last);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...