- ベストアンサー
C言語でtime_tを使った日付の取得方法について
- C言語にてtime_tを使用して日付を取得する際、日にちの2桁目が0にならず空白となる問題が発生しています。
- 入力したソースコードに問題がある可能性も考えられますので、ご確認ください。
- 日にちの2桁目が0にならない原因や解決方法について、教えていただけると幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> if((local->tm_mon+1)<=9) > today_month[0]='0'; > if((local->tm_mday+1)<=9) > today_day[0]='0'; こんなことしなくても、sprintfだけで0詰めできます。 sprintf/printfのマニュアルや解説をよく読んでみましょう。 > time_t timer; > struct tm *local; > struct tm *utc; これらは、なぜグローバル変数になっているのでしょうか? 他で使うわけではないので、ローカル変数でいいのでは? > extern char today[20]; > extern char today2[20]; > extern char today_year[10]; これらも、なぜグローバル変数なのでしょうか? ポインタ渡しや返り値を使うのではなく、グローバル変数に結果を返す方がよい、という明確な理由はありますか? > extern char today_month[2]; > extern char today_day[2]; C言語でよくやってしまう間違いです。 何文字までの文字列が収納できるサイズか、よーーーく考えてみましょう。 C言語には、配列の範囲を越えて利用しても、それ自体はエラーにならない、という特徴があります。 しかし、それが「期待通り」に動作するか保証はありません。
その他の回答 (2)
- hanabutako
- ベストアンサー率54% (492/895)
素朴な疑問なのですが、strftimeを使うのはダメなんでしょうか。 http://msdn.microsoft.com/ja-jp/library/fe06s4ak.aspx 他の回答で指摘されている通り、 ヌル文字を考慮して配列を確保しないとバッファ溢れして他のデータを破壊しますね。 例えば、"abc"はメモリー上ではa b c \0と表現されているので4バイト使うというのは聞いたことありませんか?
お礼
ご回答ありがとうございます。勉強になりました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> extern char today_month[2]; > extern char today_day[2]; 2文字格納するには足りなくない? 末尾の'\0'があふれますよ?
お礼
ご回答ありがとうございます。情けないです。
お礼
ご回答ありがとうございます。自分の弱さがしみじみ出ます。