こんにちは。
今現在、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で質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
C言語についてです。
-
プログラミングの授業の課題です
-
#defineが使用するメモリ領域に...
-
受信データから必要な部分のみ...
-
Cでファイルの行数をカウントす...
-
矢印キーを押下してコンソール...
-
2進数の表示
-
C言語でのCSVファイルの読み出...
-
プログラムC
-
char型2つを結合し、short型に...
-
バイナリファイル(画像)のよみ...
-
【C言語】文字列による処理の分...
-
C言語で複数列のデータを1列の...
-
エラーについて質問です。
-
ビルドエラーの対処がわからな...
-
「an=(n-1)/(n+1)のときlim[n→∞...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
空白を含んだ文字列がうまく格...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
プログラミングの授業の課題です
-
C言語のプログラムで、途中で止...
-
C++で指定文字列のカウント方法...
-
C言語で複数列のデータを1列の...
-
C言語でのCSVファイルの読み出...
-
構造体メンバの初期化
-
なぜ無限ループになるかが分か...
-
reallocでエラー
-
Ç言語でファイルサイズを変更す...
-
ファイル操作で全角空白を消す
-
矢印キーを押下してコンソール...
-
セグメンテーションエラーの原...
-
static付き宣言の初期化
-
ファイルから数字列を16進数の...
おすすめ情報