ここから質問投稿すると、最大4000ポイント当たる!!!! >>

ツェラーの公式を用いて、日付(年月日)から曜日を算出する方法があります。
例えばY年M月D日の曜日は、下式で求められます。
(Y + Y/4 - Y/100 + Y/400 + (13*M + 8)/5 + D) % 7
*但し、1月・2月は、前年の13月・14月とする。
*答えは0=日曜~6=土曜

これを応用して(別に応用しなくても良いんですが・・・)日付と曜日から、1週間前の同一曜日の日付を求めるプログラムを考えております。
例)
入力:2005年9月21日、水曜日
出力(解):2005年9月14日

この例は非常に簡単に求められますが、完全汎用型のプログラムを考えております。
しかし、なかなか良い知恵が出ません!!
どなたかご教示頂けると助かります。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

yyyy年mm月dd日の 1週間前の日を求める, 手抜きな方法:


1. dd から 7 を引く
2. 1 の答が 0以下になったら mm から 1 を引き, (更新後の) その月の日数を dd に足す
3. mm が 0 になったら yyyy から 1 を引き mm を 12 にする
真面目にやると面倒なので, 一旦ユリウス通日にしてから 7 を引いて戻すのがよいかと.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

まず最初に、その方法を考えました。
やはり一番素直で簡素な回答ですよね?
月毎の末日はテーブルに入れておき、参照するようにすれば良いですね。
この方法でも試してみます。

ありがとうございました!

お礼日時:2005/09/22 09:33

> 完全汎用型のプログラムを考えております。



完全汎用型というのはどんなものを想定していますか?一般的な意味で解釈すると、完全に汎用のものを作ることはかなり難しいと思います。

まず、グレゴリオ暦が採用されたのは(本能寺の変が起きた)1582年からですが、各国によって実際の導入時期はまちまちで、日本では1873年から導入されました。これを反映するには、ロケールに応じてユリウス暦とグレゴリオ暦を切り替えることになりますが、日本のように太陰太陽暦を用いていた国などではエラーにするしかないと思います。

また、曜日の概念が導入されたのは321年のコンスタンティヌス帝時代のローマですが、他の国の導入時期を正確に把握するのは困難です。

さらに、グレゴリオ暦(というより協定世界時)は、未来永劫修正なしで済ませられるほど、精度が高いわけでもありません。何万年後か知りませんが、必ず何らかの補正が必要になることでしょう。しかし、現在の我々には、未来の暦法を知るすべなどありません。

もし、単に最近の年代だけを扱えばよいのであれば、mktimeを使えば簡単にできます。

struct tm t;
t.tm_year = -1900 + 2005;
t.tm_mon = -1 + 9;
t.tm_mday = 21;
t.tm_hour = 0;
t.tm_min = 0;
t.tm_sec = 0;
t.tm_isdst = -1;

t.tm_mday -= 7; /* 1週間前 */

if (mktime(&t) == (time_t)-1)
 fputs("エラー\n", stderr);
puts(asctime(&t));
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

すいません、完全汎用型というのは大袈裟な表現でした。
その時代まで遡って正常に動くものは考えておりません。
過去100年間程度正常に動くもの、と考えています。
他の方のも参考に、出来るような気がしてきました。

ありがとうございました!

お礼日時:2005/09/22 09:42

だいたいはNo.1の回答で説明されていますが、困っているのは「3月1日~3月7日の1週間前」だと思います。



この期間は、閏年の関係で「2月末日」が何日かを計算する必要がありますので。

閏年は、
「年を4で割って割り切れる年」かつ ←条件1
「但し、100で割って割り切れる場合は除外」かつ ←条件2
「但し、400で割って割り切れる場合は除外しない」 ←条件3
と言う判定を行って計算します。

ツェラーの公式の
Y + Y/4 - Y/100 + Y/400
の部分が、この判定に相当します。

正しく判定出来たならば、
1896年 閏年 ←条件1に該当
1900年 通常年 ←条件2に該当
1904年 閏年
 |
1996年 閏年
2000年 閏年 ←条件3に該当
2004年 閏年
 |
2096年 閏年
2100年 通常年
2104年 閏年
と判定される筈ですので、ご自分で書かれた判定プログラムを試してみて下さい。

蛇足ですが、古い「カレンダーICチップ」の中には「年を4で割って割り切れる年が閏年」とだけ計算していて、2つの例外条件を無視しているICチップがあります。
なぜなら、その条件のみで「1901~2099年」の約200年間は正しく動くからです。
コストダウンの為だと思いますが「どうせ2100年が来る前に耐用年数を超して壊れるだろう」と言うのもあったのでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

閏年の判定方法をご教示頂き、感謝致します。
参考にさせて頂きます。

確かに常識的な期間だけ正常に動けばいいや!と考えますね(^◇^;)

ありがとうございました!

お礼日時:2005/09/22 09:39

回答と言うよりヒントですが……



まず、大抵の処理系には、「日付・時刻」を管理するクラスがあります。これまた大抵、「日付の連番」と「年月日それぞれの値」が使えますので、

・年月日→連番に変換
・連番になった状態で、7日分をマイナス
・それをさらに、年月日に戻す。
という手があります。


No.1 の形の回答にある、ユリウス通日に戻すのも同じ考え方です。

標準のCのライブラリの範囲では、time.h というヘッダに、一式関数が入っていますので、じっくり眺めれば使えると思います(使ったことはありません・いつも、処理系についているクラスを使っているので)

参考URL:http://wisdom.sakura.ne.jp/programming/c/c60.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

連番でやる方法もあるんですねー。
全く考えもしませんでした。
面白そうなので、ヒントを参考に考えてみます。

組み込み機器のプログラムなのでライブラリは極めて少なく、
かつコードをスリム化するために使用出来ないのです(>_<)

言葉足らずで申し訳ありませんでした!

お礼日時:2005/09/22 09:36

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語を使って、ある特定の日の前日を求めたい

プログラミングを初めて約2か月の初心者です。

C言語を使って、int型で表示されたある日付から、一日分差し引いた日付を求めたいのですが。
(例えば、2008年7月31日を求めたいなら、
20080801 から、一日分差し引い、20080731 にする。)

どうしたらいいのか全く分からない状態なので、
なにかとっかかりになるものだけでもいいので、教えていただけないでしょうか。
よろしくおねがいします。

Aベストアンサー

ずっと昔やずっと未来の年を扱うのでなければ、

int date = 20080801;
struct tm t = { 0 };
t.tm_year = -1900 + date / 10000;
t.tm_mon = -1 + date / 100 % 100;
t.tm_mday = date % 100 - 1;
mktime(&t);

とすれば、tに正しい年月日が格納されます。

Q文字列中に含まれる文字の個数をカウントするプログラムについて…

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
cnt++;
str++;
}
return cnt;
}

int main()
{
const char *str="hello,world!";
const ch='o';

int cnt;

cnt=count(str, ch);

printf("%s中に%cは%d個です\n", str, ch, cnt);


return 0;
}

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
...続きを読む

Aベストアンサー

scanf"%s", str)は、バッファオーバーフローの危険と改行文字の食べ残し問題がありますね。
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
int main()
{
char ch;
char str[BUFSIZ];
int cnt;

printf("文字列を入力して下さい > ");
fgets(str,BUFSIZ,stdin);

printf("カウントする文字を入力してください > ");
ch = getchar();

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Q日付の差分の求め方(日、分)

NT4WS+VC++6.0 Win32コンソールアプリで作ってます。
現在int型で
year1,month1,day1 year2,month2,day2
の様に、1と2それぞれ年月日を持っています。
(year2/month2/day2) - (year1/month1/day1)
と言った感じで1と2の差が何日かを求めたいのです。
VBで言うDateDiffみたいなことがやりたいのです。
よろしくお願いします。

Aベストアンサー

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

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

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
    time_t t1, t2;
    double diff;

    // 開始・終了日を time_t 型の変数にする
    memset(&d, 0, sizeof(d));
    d.tm_year = year1 - 1900;
    d.tm_mon = month1 - 1;
    d.tm_mday = day1;
    t1 = mktime(&d);
    d.tm_year = year2 - 1900;
    d.tm_mon = month2 - 1;
    d.tm_mday = day2;
    t2 = mktime(&d);

    diff = difftime(t2, t1);

    // difftime() の返り値は「秒」で double 型
    // ÷60÷60÷24 で日数にして、+0.5 は四捨五入のため
    printf("%d 日差.\n", (int)(diff / 60 / 60 / 24 + 0.5));
  }

  return 0;
}

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

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

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
...続きを読む

Qカレンダープログラム、曜日の出力について。

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio.h>
#include<stdlib.h>

int main(void)

{
char ss[9],cop1[5],cop2[3],cop3[3];

int year,manth,day,aa,cc,i,f;

gets(ss);

ss[8] = 0;
cop1[4] = 0;
cop2[2] = 0;
cop3[2] = 0;

for(i = 0;i <= 3;i++){
cop1[i] = ss[i];
}
for(i = 0;i <= 1;i++){
cop2[i] = ss[i+4];
}
for(i = 0;i <= 1;i++){
cop3[i] = ss[i+6];
}
year = atoi(cop1);
manth = atoi(cop2);
day = atoi(cop3);

printf("%d年%d月%d日",year,manth,day);

for(f = 1900; f <= year; f++){  //閏年か平年で日数を変える
if((year%4) == 0 && year != 1900){
aa += 366;
}
else{
aa += 365;
}
}
if((year%4) == 0 && manth >= 3 ){//閏年かつ3月以降日数+1
aa += 1;
}

switch(manth){
case 1:
cc = (aa + day)%7;
break;
case 2:
cc = (aa + 31 +day)%7;
break;
case 3:
cc = (aa + 59 +day)%7;
break;
case 4:
cc = (aa + 90 +day)%7;
break;
case 5:
cc = (aa + 120 +day)%7;
break;
case 6:
cc = (aa + 151 +day)%7;
break;
case 7:
cc = (aa + 181 +day)%7;
break;
case 8:
cc = (aa + 212 +day)%7;
break;
case 9:
cc = (aa + 243 +day)%7;
break;
case 10:
cc = (aa + 273 +day)%7;
break;
case 11:
cc = (aa + 304 +day)%7;
break;
case 12:
cc = (aa + 334 +day)%7;
break;
}
switch(cc){
case 1:
printf(" (月)");
break;
case 2:
printf(" (火)");
break;
case 3:
printf(" (水)");
break;
case 4:
printf(" (木)");
break;
case 5:
printf(" (金)");
break;
case 6:
printf(" (土)");
break;
case 0:
printf(" (日)");
break;
}

return 0;

}

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio...続きを読む

Aベストアンサー

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // 閏年(4で割れる年)
 return 0;       // 平年(それ以外の年)
}

// メイン関数
int main( void )
{
 static const char *table[] = { "日", "月", "火", "水", "木", "金", "土" };
 // 宣言
 int year = 0;
 int month = 0;
 int day = 0;
 int week = 0;
 // カウンタ
 int days;
 int i;
 
 // 年月日の入力
 scanf( "%04d/%02d/%02d", &year, &month, &day );
 // 1900年以降の日数を数える
 for ( days = 0, i = 1900 ; i < year ; i++ ){
  days += (FuncIsLeapYear(i) ? 366 : 365);
 }
 // 1月1日から日数を加える
 switch ( month ){
  CASE 1: days += 0;
  CASE 2: days += 31;
  CASE 3: days += 31 + 28;
  CASE 4: days += 31 + 28 + 31;
  CASE 5: days += 31 + 28 + 31 + 30;
  CASE 6: days += 31 + 28 + 31 + 30 + 31;
  CASE 7: days += 31 + 28 + 31 + 30 + 31 + 30;
  CASE 8: days += 31 + 28 + 31 + 30 + 31 + 30 + 31;
  CASE 9: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
  CASE 10: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
  CASE 11: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
  CASE 12: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
 }
 // 3月以降で閏年なら+1日
 if ( (month >= 3) && FuncIsLeapYear(year) ){
  days++;
 }
 // 入力した日付を加える
 days += day;
 // 曜日の計算
 week = (days % 7);
 // 表示
 printf( "year = %d\n", year );
 printf( "month = %d\n", month );
 printf( "day = %d\n", day );
 printf( "week = %s\n", table[week] );
 return 0;
}
以上。

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // ...続きを読む

Q日付から曜日を求めたい

Windows APIでプログラミングしています。時間のデータはSYSTEMTIMEを使ってます。

日付(wYear, wMonth, wDay)のみの情報から、曜日(wDayOfWeek)を求めたいのですが、どのような方法があるでしょうか?曜日を求めるAPI関数は存在しますか?

Aベストアンサー

曜日が入っていない状態のSYSTEMTIMEからSystemTimeToFileTimeでFILETIMEに変換し、
FileTimeToSystemTimeでSYSTEMTIMEに戻せば、曜日が入った状態になります。

QC言語のポインターに関する警告

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int=i; /*main関数内のfor文で使用*/
char line[100], out[100];
void change(int);

/*関数*/
void change(int i)
  {
   if(line[i]=='1'){
    out[10]="a\0"
   }if(line[i]=='2'){
    out[10]="b\0";
   }if(line[i]=='3'){
    out[10]="c\0"
}
}

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int...続きを読む

Aベストアンサー

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(line[i]=='1'){
    out[10]=0x61; /* aのASCIIコード */
   }if(line[i]=='2'){
    out[10]=0x62; /* bのASCIIコード */
   }if(line[i]=='3'){
    out[10]=0x63; /* cのASCIIコード */
}
}
と書きましょう。

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(l...続きを読む

QC言語を使用し、同じ内容のファイルを増やす

始めまして、ちょっと困っている事があります。
今現在Cで、あるプログラムを作ってます。

さて困っている内容ですが、testと記述されているテキストファイルを増やす所で困ってます。

「test」と記述されている「test.txt」を記述内容は同じで
「test01.txt」「test.02.txt」「test03.txt」・・・
と増やすにはどのようにプログラムを書けば宜しいでしょうか?

*因みに、こちらが作成してみたプログラムです。
renameを使用して元のファイルを変えていく感じでやっていましたが・・

#include <stdio.h>
#define MANGA 10

/*int main(void)
{
char oldname[256] = "bace00.html", newname[256] = "bace01.html";
FILE *fp;
int i,a;

printf( "%s\n", newname );
for( a = 0; a < MANGA; a++ ){
printf( "%d",a );
printf( "%s\n", newname );
rename(newname, "bace02.html");
printf( "%sあああ\n", newname );
//rename(oldname, newname)
//newname[256] = "bace";
for( i = 0; i < MANGA; i++ ){
fp = fopen( "bace00.html","w" );
fprintf( fp, "<html>\n<title>%s</title>\n<head>\n</head>\n</html>\n" );

fclose( fp );
*/
/* ファイル名の変更 */
/*if (rename(oldname, newname) == 0){
printf("%s のファイル名を %s に変更しました。\n", oldname, newname);
}else{
perror("rename error");
}
}
}

return 0;
}*/

始めまして、ちょっと困っている事があります。
今現在Cで、あるプログラムを作ってます。

さて困っている内容ですが、testと記述されているテキストファイルを増やす所で困ってます。

「test」と記述されている「test.txt」を記述内容は同じで
「test01.txt」「test.02.txt」「test03.txt」・・・
と増やすにはどのようにプログラムを書けば宜しいでしょうか?

*因みに、こちらが作成してみたプログラムです。
renameを使用して元のファイルを変えていく感じでやっていましたが・・

#include <s...続きを読む

Aベストアンサー

rename()はファイル名を変えるための関数です。コピーではありません。linux のコマンドでいうとmvですね。

ピュアなC言語の標準ライブラリの範囲では、ファイルのコピーに該当する関数はありません。まぁ、ファイル操作系のライブラリを導入してみるとか、邪道なところではcpコマンドを発行してしまうとかそんな手もあるでしょうが、一番原始的なのはコピー先のファイルを別途作成(open)して、元のファイルから読んだデータをそのまま書き込んでいくことでしょうね。学校の課題ならそれが正解だと思いますよ。仕事でやってるなら、場合によるので知りません。

QC言語でシステム日付との差を求める

いつもお世話になっております。
C言語で以下のような処理を実現したいと思っているのですが
可能でしょうか。

「20091020」のような8桁の日付が文字列として格納されている
変数に対して、システム日付からどれくらい差があるか。

【例】
(1)システム日付が2009/10/19
(2)チェックしたい8桁の文字列="20091025"
(3)上記(1)、(2)を利用して、差が10~20の間の場合はNG!

といったことを実現したいです。

Aベストアンサー

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

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

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 1900;
ts.tm_mon -= 1;
dat = mktime(&ts);

/* 差分算出 */
diff = difftime(dat, now);
nissuu = diff / (60*60*24);

}

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

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

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 19...続きを読む


人気Q&Aランキング