Отображение строки времени, созданной с использованием 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
гарантирует, что вы получите желаемый отступ.