2017-08-26 72 views
3

我想在這種形式顯示一個字符串創建:在殼體天 「在3天內0點15分07秒」或「0點15分07秒」被0顯示時間字符串使用asprintf

所以我寫了一些代碼如下

#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創建的字符串(第一顯示信息)顯示在這種方式。我希望它像第二個顯示的消息的結果。

有沒有人有我的錯誤的想法?

+4

prefixhours爲0,則無法將其打印爲%c。內部字符串被終止。 – rustyx

+0

@RustyX那麼你提出什麼解決方案? –

+0

@RustyX不,我認爲你不明白我想要的是什麼by prefixseconds = 0我的意思是它沒有字符,因爲它在這種情況下seconds> = 10因此沒有必要在秒數前加0 0 –

回答

2

如果您將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確保您將獲得所需的填充。

+1

哦,我不小心。是的,你有權利。 0最後是'\ 0'字符,這意味着字符串的結尾。謝謝@gsamaras。 –

相關問題