C言語関係掲示板

過去ログ

No.591.YYYYMMDDの日付の文字列をYYYY/MM/DDにしたい

[戻る] [ホームページ]
No.5602

構造体のキャスト
投稿者---坂本(2003/03/19 13:58:53)


以前に何かで構造体のキャスト(?) を見たことがあって、実際にやってみたのですが思ったようにいきません。

8桁(YYYYMMDD)の日付の文字列を10桁(YYYY/MM/DD)にしたい。

いまこんな感じで書いています。
--------------------------------------
struct yyyymmdd{
char yy[4];
char mm[2];
char dd[2];
};

int main( void ){

struct yyyymmdd *ymd;
char s[8+1];

memset( s, 0x00, sizeof( s ) );
memcpy( s, "20030218", sizeof( s ) );

ymd = ( struct yyyymmdd * )s;

printf( "%s/%s/%s\n", ymd->yy, ymd->mm, ymd->dd );

}
----------------------------------------------------
こうすると

20030218/0218/18

こんな風になります。
確かにそうなるのは当たり前と思うのですが、これをどうにかして
YYYY/MM/DDのように出来ないものでしょうか。

ご助言お願いします。

No.5604

Re:構造体のキャスト
投稿者---麗(2003/03/19 15:25:37)


私の能力ではこんなのしか思いつきませんでした。

#include <stdio.h>

struct yyyymmdd {
  char            yy[4+1];
  char            mm[2+1];
  char            dd[2+1];
};

int
main(void)
{
  char            *day = "20030218";
  struct yyyymmdd ymd;

  memset(&ymd, '\0', sizeof(ymd));

  memcpy(ymd.yy, &day[0], sizeof(ymd.yy) - 1);
  memcpy(ymd.mm, &day[4], sizeof(ymd.mm) - 1);
  memcpy(ymd.dd, &day[6], sizeof(ymd.dd) - 1);

  printf("%s/%s/%s\n", ymd.yy, ymd.mm, ymd.dd);

  return 0;
}


No.5609

Re:構造体のキャスト
投稿者---kikk(2003/03/20 01:39:36)


ども。


>printf( "%s/%s/%s\n", ymd->yy, ymd->mm, ymd->dd );



printf( "%.4s/%.2s/%.2s\n", ymd->yy, ymd->mm, ymd->dd );

にすればよろしいかと。

なお、charとcharの間ならパディングがない、という保証はありません。
まあ、たぶん期待通りになりますが、いちおう。
(坂本さんはわかっておられると思いますが)


では。