Отображение строки времени, созданной с использованием asprintf

Я хочу отобразить строку в этой форме: "через 3 дня 00:15:07" или "в 00:15:07" в случае дней 0

поэтому я написал некоторый код следующим образом

#include<stdio.h>

#define LEASE_TIME_USING_DAYS "in %d days %c%d:%c%d:%c%d\n"
#define LEASE_TIME_NOTUSING_DAYS "in %c%d:%c%d:%c%d\n"

int main(){
    int seconds, minutes, hours, days;
    char *leasetime;

    /* Just for test */
    seconds = 7;
    minutes = 15,
    hours = 0;
    days = 3;
    /*End just for test*/

    char prefixseconds, prefixminutes, prefixhours;
    if(seconds<10) prefixseconds=48; else prefixseconds=0;
    if(minutes<10) prefixminutes=48; else prefixminutes=0;
    if(hours<10) prefixhours=48; else prefixhours=0;
    if(days>0) asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, prefixhours, hours, prefixminutes, minutes, prefixseconds, seconds);
    else asprintf(&leasetime,LEASE_TIME_NOTUSING_DAYS, prefixhours, hours, prefixminutes, minutes, prefixseconds, seconds);

    printf("lease time = %s\n", leasetime);
    printf(LEASE_TIME_USING_DAYS, days, prefixhours, hours, prefixminutes, minutes, prefixseconds, seconds);
}

Я получаю этот вывод в консоли:

lease time = in 3 days 00:
in 3 days 00:15:07

Я не знаю точно, почему созданная строка с asprintf (первое отображаемое сообщение) отображается таким образом. Я хочу, чтобы это было похоже на результат второго отображаемого сообщения.

У кого-нибудь есть идеи, где я ошибся?

1 ответ

Решение

Если вы изменили seconds а также hours чтобы быть больше 10, вы увидите, что проблема сохраняется.

когда prefixhours 0 вы пытаетесь распечатать его как символ (%c) но этого не произойдет, потому что 0 обрабатывается как нулевой терминатор строки.

В результате, в зависимости от того, какие нули вы вводите в строку, строка завершается (до того, как вывести то, что вы ожидаете).


Решение @RustyX заключается в следующем:

if(seconds<10) prefixseconds=48; else prefixseconds='0';
if(minutes<10) prefixminutes=48; else prefixminutes='0';
if(hours<10) prefixhours=48; else prefixhours='0';

вместо того, что вы делаете сейчас (чтобы нулевой терминатор не вводился в строку). Обратите внимание, что вы должны оставить ваши типы данных как те, которые в вашем вопросе для ваших переменных).


Как упомянуто @xing:

изменить это:

%c%d:%c%d:%c%d

к этому:

%02d:%02d:%02d

и вы будете в порядке, делая это:

asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, hours, minutes, seconds);

02 гарантирует, что вы получите желаемый отступ.

Другие вопросы по тегам