2016-04-07 1 views
0

次のようなprintf使用する場合:Cで文字バッファに格納するためにctimeを実装するにはどうすればよいですか?

printf("Time as a basic string = %s", ctime(&seconds)); 

を出力は次のようになります。

Wed, 28 Oct 2009 11:35:37 

私はそのようctimeが生成する。この出力を保存するにはどうすればよい:

私がしようとどのような
char result[80] = ctime(&seconds); 

ちょうどうまくいかないようです。

+0

最善の方法は、パラメータの長さと共に配列を渡すことです(渡されると配列の最初の要素へのポインタに調整され、サイズ情報が失われるため)。この関数は、提供されたバッファに書き込むことができます。試したやり方での配列の割り当ては、一般的にCでは不可能です(strcpy()が必要です)。 –

+0

既存の 'ctime()'を(同等のものを実装するのではなく)*使用したい場合は、後でctimeをもっと呼び出すと、strcpyが本当に答えになります。呼び出しが1つだけの場合は、ポインタ変数に返されたポインタを格納します。 'char * T0 = ctime(&seconds);'が実行します。 'ctime()'には独自のメモリがあり、それは遠ざかりません。 –

+0

'char result [80]; strcpy(結果、ctime(&秒)); '? –

答えて

1

strcpyとして、既に複数のコメント(したがって、これはコミュニティのwikiであること - それは私の答え正直ではありません)によって提案された特定のユースケースのために正しいです。配列resultをポインタに切り替え、strdupを使用して、後でfreeの責任を負うコストで文字列の長さを仮定することを避けることも検討してください。だから、:

char result[80]; 
strcpy(result, ctime(&seconds)); 

または:

char *result = strdup(ctime(&seconds)); 

... when you're done using result: ... 
free(result); 
+1

技術的には間違いはありますが、多くの 'ctime()'実装はスレッドローカルにされていない 'static'バッファに依存しているという弱点があります。したがって、リエントラントでないバージョンよりもリエントラントなAPIの方を優先する必要があります。 – jxh

1

ctimeの代わりにctime_rを使用します。

char result[80]; 
ctime_r(&seconds, result); 
+0

私はOPが* ctimeを実装しようとしているのを理解しましたが、おそらく私は間違っています... –

+0

私の理解は違っていました。だから私からの投票。 – Tommy

0

あなたはこの機能int snprintf(char *str, size_t size, const char *format,...);を使用することができます。

これで、文字列を書式設定できます。たとえば、

snprintf(result, MAX, "Time as a basic string = %s", ctime(&seconds)); 

のようになり、文字列"Time as a basic string = Wed, 28 Oct 2009 11:35:37"が結果文字配列にコピーされます。任意の文字列をctime(&seconds)によって返された文字列とともにsnprintf()を使用して追加できます。

誰かが文字列をコピーする別の方法を述べました。そのためには、結果を文字へのポインタとして宣言し、strdup()を使用する必要があります。あなたもそれを使用することができますが、あなたのコードが動的メモリ割り当てのために埋め込みデバイスのために書かれている場合、私はそれを好むことはありません。

関連する問題