【问题标题】:Displaying time string created using asprintf显示使用 asprintf 创建的时间字符串
【发布时间】:2018-02-04 06:53:50
【问题描述】:

我想以这种形式显示一个字符串: "in 3 days 00:15:07" or "in 00:15:07" in case days 为 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 的字符串(第一个显示消息)会以这种方式显示。我希望它像第二条显示消息的结果。

有人知道我哪里出错了吗?

【问题讨论】:

  • prefixhours 为 0,您不能将其打印为 %c。在内部,字符串被终止。
  • @RustyX 那么你有什么建议作为解决方案?
  • @RustyX 不,我认为您不太了解我想要的 prefixseconds=0 我的意思是没有字符,因为在这种情况下 seconds>=10 所以没有必要在前面添加 0秒数
  • 您显示的代码是重复的。这违反了DRY principal

标签: c string time io asprintf


【解决方案1】:

如果您将secondshours 更改为大于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 确保您将获得所需的填充。

【讨论】:

  • 哦,我不小心。是的,你有权利。 0 最后是 '\0' 字符,表示字符串的结尾。谢谢@gsamaras。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2014-09-14
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多