Как использовать простое утверждение, чтобы описать повторяющиеся спецификаторы формата о функции 'sprintf' в C? - PullRequest
0 голосов
/ 10 февраля 2019

Ниже мой код.Я хочу сделать это более эффективным.Существует так много спецификаторов формата, которые идентичны.И есть также похожие цели, которые принадлежат массиву.

Мои вопросы ...

  1. Как я могу уменьшить количество повторяющихся спецификаторов формата?
  2. Как я могу использовать общее выражение для целей (double [i])?

Спасибо за вашу помощь.

char * msg = sprintf("%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",
                             intnum,       doublenum[0],  doublenum[1],
                             doublenum[2], doublenum[3],  doublenum[4],
                             doublenum[5], doublenum[6],  doublenum[7],
                             doublenum[8], doublenum[9],  doublenum[10]);

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Я написал этот простой пример кода, который считывает параметры из командной строки и вставляет их в переменную msg.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char msg[2000];
    int msgl;
    int x,i,n;
    double d[10];

    //    Load values from command line
    // -----------------------------------------
    if (argc>12 || argc<3) {
        puts("Usage: prgname ni nd1 {nd2,nd3 ..., nd10}\n");
        return 1;
    }

    n=argc-2; // number of double values

    x=atoi(argv[1]);
    for(i=0;i<n;i++)
        d[i]=strtod(argv[i+2],NULL);
    // -------------------------------------------

    // -------------------------------------------
    //     THE ALGORITHM SOLVING THE QUESTION
    // -------------------------------------------
    *msg=0;     // clear msg
    msgl = sprintf(msg,"%d",x);

    for(i=0;i<n;i++)
        msgl += sprintf(msg + msgl," %lf", d[i]);
    // -------------------------------------------

    puts(msg);
    return 0;
}
0 голосов
/ 10 февраля 2019

Сначала необходимо предоставить достаточно большой буфер для записи.Сигнатура sprintf равна

int sprintf(char *str, const char *format, ...);

. Возвращает количество символов, записанных в буфер str.

. Вы можете захватить это значение, чтобы настроить указатель на str с помощьюсмещение на количество написанных символов.

Без каких-либо проверок на ошибки и защиты от переполнения буфера это может выглядеть примерно так:

char msg[BUFSZ];
int msgl = sprintf(msg, "%d", integer);
for(int i = 0; i < 10; ++i)
{
    msgl += sprintf(msg + msgl, " %lf", ds[i]);
}

для некоторых достаточно больших BUFSZ.

0 голосов
/ 10 февраля 2019

Ваша лучшая ставка, вероятно, заключается в следующем:

double array[10] = { 25.66, 87.51, 38.53, 26.59, 85.54, 47.82, 69.68, 27.79, 21.98, 12.80, };
enum { NUM_ARRAY = sizeof(array) / sizeof(array[0]) };
char buffer[1024];
int integer = 3141592;

int offset = 0;
int nbytes = snprintf(buffer + offset, sizeof(buffer) - offset, "%d", integer);
if (nbytes < 0) { …report error and stop processing… }
offset += nbytes;
for (int i = 0; i < NUM_ARRAY; i++)
{
    nbytes = snprintf(buffer + offset, sizeof(buffer) - offset, " %lf", array[i]);
    if (nbytes < 0) { …report error and stop processing… }
    offset += nbytes;
}

Строго, код должен проверять nbytes >= sizeof(buffer) - offset, чтобы убедиться в отсутствии усечения.

Считаете ли вы, чтопроще другое дело.Однако он гораздо более гибкий, чем оригинал (или обладает потенциалом быть более гибким).Если вам нужно вывести только 8 или большое количество значений, то (с соответствующей упаковкой в ​​функции) вы можете обработать все варианты.Вы можете играть в различные другие приемы, например, убедиться, что строка вывода не станет длиннее, чем N байтов, вставить новую строку и, возможно, некоторые начальные отступы.Небо это предел.

0 голосов
/ 10 февраля 2019

Простой пример будет: -

#include <stdio.h>
#include <string.h>

int main(void) {

    char msg[100]; 
    int x=1, i=0;
    double d[10]; 
    for(i=0; i<10; i++)
        d[i] = i+10.0;
    sprintf(msg, "%d", x); 
    for(i =0; i<10; i++){
        sprintf(msg + strlen(msg), " %lf", d[i]);
    }

    printf("%s\n", msg);
    return 0;
}
...