我想以这种形式显示一个字符串:
如果天数为0,则“在3天内00:15:07”或“在00:15:07”

所以我写了一些代码如下

#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(第一条显示消息)创建的字符串以这种方式显示。我希望它像第二条显示的消息的结果。

有人知道我哪里出问题了吗?

最佳答案

如果将secondshours更改为大于10,您将发现问题仍然存在。

prefixhours为0时,您尝试将其打印为字符(%c),但这不会发生,因为0被视为字符串的空终止符。

结果,取决于您向字符串中注入(inject)的零,字符串被终止(在打印出您期望的字符串之前)。

@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终止符注入(inject)到字符串中)。请注意,您应该将数据类型保留为问题中变量的类型。

正如@xing提到的:

改变这个:
%c%d:%c%d:%c%d

对此:
%02d:%02d:%02d

通过执行以下操作,您会没事的:
asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, hours, minutes, seconds);
02确保您将获得所需的填充。

07-28 01:31
查看更多