显示使用 asprintf 创建的时间字符串
Displaying time string created using asprintf
我想以这种形式显示一个字符串:
"in 3 days 00:15:07" 或 "in 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创建的字符串(第一个显示消息)会这样显示。我希望它像第二条显示消息的结果一样。
有人知道我哪里出错了吗?
如果您将 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';
而不是你现在所做的(这样 null 终止符就不会被注入到字符串中)。请注意,您应该将数据类型保留为变量问题中的数据类型)。
正如@xing 提到的:
改变这个:
%c%d:%c%d:%c%d
对此:
%02d:%02d:%02d
你会没事的,这样做:
asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, hours, minutes, seconds);
02
确保您将获得所需的填充。
我想以这种形式显示一个字符串: "in 3 days 00:15:07" 或 "in 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创建的字符串(第一个显示消息)会这样显示。我希望它像第二条显示消息的结果一样。
有人知道我哪里出错了吗?
如果您将 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';
而不是你现在所做的(这样 null 终止符就不会被注入到字符串中)。请注意,您应该将数据类型保留为变量问题中的数据类型)。
正如@xing 提到的:
改变这个:
%c%d:%c%d:%c%d
对此:
%02d:%02d:%02d
你会没事的,这样做:
asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, hours, minutes, seconds);
02
确保您将获得所需的填充。