использовать snprintf при печати целочисленных значений - PullRequest
1 голос
/ 09 октября 2019

Приведенный ниже код преобразует количество секунд в формат DD:HH:MM. Вместо использования printf я хотел бы использовать snprintf. Как мне распечатать эти d, h, m в snprintf?

#include <stdio.h>

#define LONGEST 60

int main() {
    int sec, h, m, s, d, temp; 
    char *temp_str;
    int test= 2835656; 
    d = test / 86400; //divide the number of seconds by the number of seconds in a day
    if (d < 100) {
        temp = test % 86400; 
        temp /= 60;  // 
        h = temp / 60; //to get "minute" 
        m = temp % 60; //to get "second"
    } else {
        d = 99;
        h = 23;
        m = 59;
    }

    printf("DD:HH:MM:%d:%d:%d\n", d, h, m); //output is DD:HH:MM:32:19:40

    return 0;
}

Я пытался snprintf(temp_str, LONGEST, "%02s:%02s:%02s", d, h, m);, но это не сработало

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Почему другая строка формата для попытки snprintf? Просто сделайте это так же, как в вызове printf:

snprintf(temp_str, LONGEST, "DD:HH:MM:%d:%d:%d", d, h, m);

Спецификатор %02s не работает для целых чисел. Вы также не объявили temp_str, поэтому вам нужно сделать это заранее:

char temp_str[LONGEST];

После вызова snprintf строка "DD:HH:MM:32:19:40" сохраняется в temp_str, и вы можете проверить это с помощьюputs(temp_str);, например.

0 голосов
/ 09 октября 2019

Вы должны определить temp_str как массив char как минимум с LONGEST элементами, и вы можете использовать ту же строку формата, что и для printf.

Обратите внимание, что ваша строка форматадолжно быть "%02d:%02d:%02d" для получения 2 цифр для каждого поля даже для значений ниже 10.

Вот модифицированная версия:

#include <stdio.h>

#define LONGEST 60

int main() {
    int sec, h, m, s, d, temp; 
    char temp_str[LONGEST];
    int test = 2835656;

    d = test / 86400; //divide the number of seconds by the number of seconds in a day
    if (d < 100) {
        temp = test % 86400; 
        temp /= 60;    // discard the seconds
        h = temp / 60; // to get "hour" 
        m = temp % 60; // to get "minute"
    } else {
        d = 99;
        h = 23;
        m = 59;
    }

    snprintf(temp_str, LONGEST, "DD:HH:MM:%02d:%02d:%02d\n", d, h, m); //output is DD:HH:MM:32:19:40
    fputs(temp_str, stdout);

    return 0;
}
...