2016-10-21 1 views
1

私はctimeを使用しています。ただし、常にnullを返します。それはsprintfの行をコアにします。それはより早く働いた。なぜそれが無作為にnullを返すのかは分かりません。ctimeはNULLを返します

私は、次のコードスニペットを持っている:

int main() 
{ 
char avp_val[50]; 

uint32_t date_value=1477069401; 

sprintf(avp_val,"%s",ctime((time_t*)(&date_value))); 

    return; 
} 
+3

こんにちは!プログラミングの質問はStackOverflow.comにはありません。 SUの話題について話し合っているかどうかについては、ヘルプセクションを見てください。移行するように投票しました。 – techie007

+0

なぜ 'uint32_t'は' time_t'と同じだと思いますか? –

+1

'date_value'を' uint32_t'の代わりに 'time_t'に指定してください – selbie

答えて

1

それは私のために動作しますが、コードはまだ奇数です。

時間を保存するのになぜuint32_tを使用しているのかわかりません。 time_t(必要な場合はint)にする必要があります。時間は署名されていない、それは否定的かもしれない(私は1970年の前に時間があったと聞く)。 32ビットであってはなりません。もしそうなら、you'll run out of time in 2038。ほとんどのマシンは最近、64ビットtime_tを使用しています。

ctimeは、同じポインタを再利用するため、使用しないでください。文字列をコピーするためにsprintfをやっているのはこのためだと思います。さらに、割り当てられた文字列を渡したctime_rを使用してください。

ここではこれを行うもっと簡単な方法があります。

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

int main() { 
    time_t date_value = 1477069401; 

    char date_str[26]; 

    ctime_r(&date_value, date_str); 

    puts(date_str); 

    return 0; 
} 
+0

Unixy 1secタイムスタンプの選択肢があるときは、64bitを使うべきです。しかし、 'ctime(&t)'と 't = time(NULL)'ではなく 'time(&t)'の場合には、あなたはMUSTどのような 'time_t'を実装しても大丈夫か小さいかは決してありません。もしOPのシステムが 'most_type 'に' time_t'64bitを持っていれば、32bitの '&var'を渡すことはおそらく問題を引き起こします(そして、未定義の動作です)。 ... –

+0

...また、 'strncpy'は一般的に文字列をコピーする正しい方法ではありません。他の 'n 'ルーチンは'切り捨て 'するだけです(それでも_always_ rightではありません)。しかし、' strncpy'は_any_文字列ターミネータなしでコピーできます。標準または任意のmanページを参照してください。 'strlcpy'がうまくいけば;もしC11 'strcpy_s'が大丈夫なら、あなたが知っているか、サイズをチェックしているのであれば 'strcpy'を使ってください。あなたが 'snprintf(o、100、%s"、s) 'または' sprintf(o、 "%.99s"、s) 'でなければなりません。 'strncpy'ではありません。 –

+0

@ dave_thompson_085文字列を扱う多くの方法が間違っています。 Cの文字列を扱うための正しい方法はすべて標準ではないか、あるいは新しいものと思われますので、私は 'strlcpy'と一緒に行こうと思います... 2番目の考えでは、混乱を完全に避けるでしょう。 – Schwern

関連する問題