2016-05-06 5 views
0

私は単純な関数に問題があります(間違ったポインタアサイメントのために推測します)。 strptime関数(文字列をとり、すべてのデータセットでstruct tmを返す関数)がWindowsに存在しないので、私は他の基本関数を呼び出してstrptime関数の種類を作成しました。struct tm変数へのポインタは、変更を返すことができません

ここにテストコードがあります。 STRPTIME機能の中では、時間は十分に設定されていますが、メインでは情報が失われます。

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

void STRPTIME(char *strtm, struct tm *tminfo) 
{ 
    time_t rawtime; 
    int day, month, year; 

    sscanf(strtm, "%d-%d-%d\n", &year, &month, &day); 
    time(&rawtime); 
    tminfo = localtime(&rawtime); 
    tminfo->tm_year = year - 1900; 
    tminfo->tm_mon = month - 1; 
    tminfo->tm_mday = day; 

    mktime(tminfo); 
    printf("date %d-%d-%d\n", tminfo->tm_year, tminfo->tm_mon, tminfo->tm_mday); 
} 

int main() 
{ 
    char stm[11]; 
    struct tm tminfo; 

    strcpy(stm, "2015-12-31"); 
    STRPTIME(stm, &tminfo); 

    printf("tminfo %d-%d-%d\n", tminfo.tm_year, tminfo.tm_mon, tminfo.tm_mday); 

    return(0); 
} 

答えて

0

問題は、あなたがあなたのtminfo引数のポインタを上書きしていることです。

tminfo = localtime(&rawtime); 

関数の引数は、ローカル変数と似ています。上書きすることができます。それはスタックに住んでいる。しかし、あなたの呼び出し元はこの変更に気付かないでしょう。

あなたはこのような何かをする必要があります。

// Store the result in a temporary variable. 
struct tm * tmp = localtime(&rawtime); 
if (tmp && tminfo) { 
    // Copy to caller's memory. 
    memcpy(tminfo, tmp, sizeof(*tmp)); 
} 
+0

あなたは全く正しいです!私はそれを考えなかった! 'if'はlocaltimeが' NULL'を返さず、入力が 'NULL'でもあることを確認するチェックです、そうですか? – Stefano

+0

btw、このソリューションはstrptimeの問題を追い越すのに適しているのでしょうか? – Stefano

+1

はい、 'if'は' localtime'の結果と関数の引数の両方が 'NULL'でないことを確認します。これは' memcpy'の二つの引数が 'NULL'であってはならないからです。あなたのバージョンの 'strptime'は' format'引数を持たないので、それは実際には等価ではありません。だからそれが "十分に良い"かどうかは、おそらくあなたのユースケースに依存します。 [この質問](http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows)も参照してください。 – DarkDust

関連する問題