

こんにちは。
今現在、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;
}
どなたかご教示下さい。
No.2ベストアンサー
- 回答日時:
> 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言語には、配列の範囲を越えて利用しても、それ自体はエラーにならない、という特徴があります。
しかし、それが「期待通り」に動作するか保証はありません。
No.3
- 回答日時:
素朴な疑問なのですが、strftimeを使うのはダメなんでしょうか。
http://msdn.microsoft.com/ja-jp/library/fe06s4ak …
他の回答で指摘されている通り、
ヌル文字を考慮して配列を確保しないとバッファ溢れして他のデータを破壊しますね。
例えば、"abc"はメモリー上ではa b c \0と表現されているので4バイト使うというのは聞いたことありませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
csvファイルの読み取り
-
終了条件Ctrl+zについて,結果表...
-
タイムカードのシステムを作り...
-
Enterキーを押されたら次の処理...
-
fread(),fwrite()等について
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
-
既定のコンストラクタがありま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
reallocでエラー
-
エラーについて質問です。
-
static付き宣言の初期化
-
char型2つを結合し、short型に...
-
WinInetのInternetOpenUrl関数...
-
空白を含んだ文字列がうまく格...
-
C言語でファイルから複素数の値...
-
C言語で複数列のデータを1列の...
-
Cプログラムについて
-
C++で指定文字列のカウント方法...
-
プログラミング ポインタを使...
-
ビルドエラーの対処がわからな...
-
リストの作成と出力(C言語)
-
setjmp・longjmpに関しまして
-
C言語でのCSVファイルの読み出...
-
2進数の表示
おすすめ情報