プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。

今現在、C言語にてプログラミングを行っております。time_tを用いましたが、4月などの2桁目が0のは巧く取得できたのですが、日にちの2桁目が0にならず、空白となってしまいます。

一応、ソースを載せておきますが見辛いのが申し訳ないです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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];

void day(){
char *ptr;
/* 現在時刻を取得 */
timer = time(NULL);

local = localtime(&timer); /* 地方時に変換 */

/* 地方時 変換後表示 */
printf("地方時: ");
printf("%4d/", local->tm_year + 1900);
printf("%2d/", local->tm_mon + 1);
printf("%2d ", local->tm_mday);

if(local->tm_mday<10)



//system("pause");
// printf("%2d:", local->tm_hour);
// printf("%2d:", local->tm_min);
// printf("%2d", local->tm_sec);
// printf(" %d\n", local->tm_isdst);


/*****************************/
sprintf(today_year,"%4d", local->tm_year + 1900);
sprintf(today_month,"%2d", local->tm_mon + 1);
sprintf(today_day,"%2d", local->tm_mday);


if((local->tm_mon+1)<=9)
today_month[0]='0';
if((local->tm_mday+1)<=9)
today_day[0]='0';

sprintf(today, "%s-%s-%s", today_year, today_month, today_day);
sprintf(today2, "%s/%s/%s", today_year, today_month, today_day);
//printf("%s",today);
/*****************************/
// utc = gmtime(&timer); /* 協定世界時(UTC)に変換 */

/* 協定世界時 変換後表示 */
// printf("\n\n\n\n協定世界時: ");
// printf("%4d/", utc->tm_year + 1900);
// printf("%2d/", utc->tm_mon + 1);
// printf("%2d ", utc->tm_mday);
// printf("%2d:", utc->tm_hour);
// printf("%2d:", utc->tm_min);
// printf("%2d", utc->tm_sec);
// printf(" %d\n", utc->tm_isdst);

return;
}

どなたかご教示下さい。

A 回答 (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言語には、配列の範囲を越えて利用しても、それ自体はエラーにならない、という特徴があります。
しかし、それが「期待通り」に動作するか保証はありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。自分の弱さがしみじみ出ます。

お礼日時:2014/04/09 22:37

素朴な疑問なのですが、strftimeを使うのはダメなんでしょうか。


http://msdn.microsoft.com/ja-jp/library/fe06s4ak …

他の回答で指摘されている通り、
ヌル文字を考慮して配列を確保しないとバッファ溢れして他のデータを破壊しますね。
例えば、"abc"はメモリー上ではa b c \0と表現されているので4バイト使うというのは聞いたことありませんか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。勉強になりました。

お礼日時:2014/04/09 22:40

> extern char today_month[2];


> extern char today_day[2];

2文字格納するには足りなくない?
末尾の'\0'があふれますよ?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。情けないです。

お礼日時:2014/04/09 22:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!