2017-08-26 6 views
3

を使用して作成: 「3日午後12時15分07秒」または「午後12時15分07秒で」ケース日間でそう0の表示時刻文字列は、私はこのフォームで文字列を表示したいasprintf

されるI

lease time = in 3 days 00: 
in 3 days 00:15:07 

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); 
} 

私はコンソールでこの出力を取得し、次のようにいくつかのコードを書きました。私はそれを2番目に表示されたメッセージの結果のようにしたい。

誰かが私が間違っていたアイデアはありますか?

+4

prefixhoursが0の場合、%cとして印刷することはできません。内部的に文字列は終了します。 – rustyx

+0

@RustyXだからあなたは何を解決策として提案しますか? –

+0

@RustyXいいえ私はあなたが望むものをよく理解していなかったと思うprefixseconds = 0それは文字がないので、秒> = 10だから秒数の前に0を追加する必要はありません。 –

答えて

2

secondshoursを10より大きく変更した場合、問題が解決しないことがあります。

prefixhoursが0の場合は、文字()として印刷しようとしますが、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'; 

代わりにあなたが今何をすべきかの(ヌルターミネータは文字列の中に注入されないように)。変数の質問にはデータ型を保持する必要があることに注意してください)。これに

%c%d:%c%d:%c%d 

%02d:%02d:%02d 

、あなたがこれを行うことにより、罰金になります:

asprintf(&leasetime,LEASE_TIME_USING_DAYS, days, hours, minutes, seconds); 
この

変更を:言及@xingとして


02は、確実に希望のパディングを得ることができます。

+1

私はそれに気を配っていませんでした。はい、あなたは正しいです。 0は最後に文字列の終わりを意味する '\ 0' charです。ありがとうございます@ gsamaras。 –

関連する問題