C言語の質問です。(初心者なのでわかりやすくお願いします。)

時刻文字列”YYYY/mm/dd hh:mm:ss”をchar time[14]に格納する方法
またその逆の方法(char time[14]から”YYYY/mm/dd hh:mm:ss”に変換)

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/12/17 16:19:17
  • 終了:--

回答(4件)

id:EddyYamanaka No.1

EddyYamanaka回答回数385ベストアンサー獲得回数12004/12/17 16:31:44

ポイント15pt

質問の意味が解りません。

上記 time 変数は char の配列ですよね?

文字列そのものですので、strcpy() でコピーする事になります。…と言う回答があるでしょう。

恐らく質問者は date や time 型を扱うのでしょう。

ここの ctime や asctime を参照してください。

また、上記文字列は[14]には入りません。

19文字+セパレータなので[20]が必要です。

id:neige_larme

あ、そうですね。質問の仕方が悪かったです。

時刻文字列中の”/”や”:”や” ”は格納せずに”YYYYmmddhhmmss”と入れたいのです。

また、date timeは諸事情があって使いません。

timeとかを使えればこんなに苦労はしないのですが。。。

すいませんが、再度回答願います。

質問への不備の指摘でもかまいません。

2004/12/17 16:39:30
id:EddyYamanaka No.2

EddyYamanaka回答回数385ベストアンサー獲得回数12004/12/17 16:34:47

ポイント15pt

ここの 13.12 が参考になるでしょう

id:neige_larme

すいませんが、上記と同様です。

2004/12/17 16:43:14
id:aki73ix No.3

aki73ix回答回数5224ベストアンサー獲得回数272004/12/17 16:53:55

ポイント50pt

http://www.hatena.ne.jp/1103267957#

人力検索はてな - C言語の質問です。(初心者なのでわかりやすくお願いします。) 時刻文字列”YYYY/mm/dd hh:mm:ss”をchar time[14]に格納する方法 またその逆の方法(char time[14]から”..

1.

int i;//カウント用

char delmit[5][2]={”/”,”/”,” ”,”:”,”:”};//デリミタ

char date[14]=”20041216151215”;//元のデータ

char date2[20],tmp[4]; //結果用とテンポラリ

strcpy(date2,date);

date2[4]=0;

//年のみ転送

for(i=0;i<5;i++){

//デリミタを付加

strcat(date2,delmit[i]);

//追加するのは2桁ずつなので取り出したい場所を2文字ずつ抽出して代入

strncpy(tmp,date+4+i*2,2);

tmp[2]=0;

//それをdate2に連結

strcat(date2,tmp);

}

2.

int i;//カウント用

char date[20]=”2004/12/16 15:12:15”; //元のデータ

char date2[14];//結果用

strcpy(date2,date);

for(i=0;i<5;i++){

//デリミタを付加

//ずらすのは2桁ずつデリミタを含む3文字なので、取り出したい場所を3文字ずつ抽出してコピー

strcpy(date2+4+i*2,date+5+i*3);

}

id:neige_larme

ありがとうございます!

2004/12/17 17:07:57
id:tzk No.4

tzk回答回数13ベストアンサー獲得回数02004/12/17 18:29:25

ポイント50pt

YYYY/mm/dd hh:mm:ss、YYYYmmddhhmmssという形式、文字列長が保証されているのであれば

char date_a[20] = ”2004/12/04 11:28:30”;

char str_a[14];

sprintf(str_a, ”%.4s%.2s%.2s%.2s%.2s%.2s”, date_a, date_a+5, date_a+8, date_a+11, date_a+14, date_a+17);

------------------------

char date_b[20];

char str_b[14] = ”20041122113344”;

sprintf(date_b, ”%.4s/%.2s/%.2s %.2s:%.2s:%.2s”, str_b, str_b+4, str_b+6, str_b+8, str_b+10, str_b+12);

で良いのではないでしょうか。

id:neige_larme

保証されてます!ありがとうございます!

2004/12/17 19:04:47
  • id:sasada
    横槍失礼します m(_ _)m


     sasadaと申します。
     回答を自作する余裕がないので、注意事項のみで失礼します。

     質問文にある char time[14] で ”YYYYmmddhhmmss”を格納しようとすると、文字列の終端を表すヌル文字を格納する場所がありませんので、文字列操作関数を用いた変換処理は危険です。注意深く扱わないと、バッファーオーバーフローしてしまいます(^^;

     char time[15] として終端にヌル文字を格納するのが一番簡単な回避方法ですが、質問の意図とはずれるかもしれませんね。

     どうしてもchar time[14] とする必要があるなら、途中の変換処理は(文字列ではなく)文字配列の扱いで泥臭ーく解体・収拾する方が安全だと愚考します。所詮は固定長ですし。
     もっとも、この処理の外側でtime[14] を文字列として扱ったときにエンバグする可能性を考えると、あまりお勧めはできません(^^;

     グダグダと変なことを書いてしまい、失礼しました。
  • id:neige_larme
    Re:横槍失礼します m(_ _)m

    激遅レスでこちらこそ申し訳ありません。
    あの後で、確かにNULL文字を格納する場所がないことに気づきました。
    細かなことでも、こちらとしましては大変勉強になりますので、
    助かります。ありがとうございました!

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません