2009-10-07 50 views
5

"HH:MM:SS"形式で現在の時刻を文字配列(文字列)に変換する必要があります。単にprintf("%s", timeString);HH:MM:SS形式の文字列への時間(C言語プログラミング)

と私はところでtimevaltime_t種類にかなり混乱しているので、任意の説明は素晴らしいだろう:)

EDIT: だから私はのstrftimeなどで試みたが、それはちょっと働きました。私のコードは以下の通りです:

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

しかし、出力は "13:49:53a ?? J`sS?"です。

最後に "?? J" s? "とは何が起こっていますか?

答えて

8

あなたはこのコードからゴミを取得している:あなたは、文字列にヌルターミネータ(\ 0)のためのスペースを許可していないので

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

、それが印刷された文字列は、そうでないとき終わりがどこであるかを知り、ストリングの一部としてメモリの次のビットにランダムなゴミを入れます。

これに変更し、それを:

time_t current_time; 
struct tm * time_info; 
char timeString[9]; // space for "HH:MM:SS\0" 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info); 
puts(timeString); 

そしてstrftime()は\ 0を追加するための十分なスペースを持っていますので、それが正常に動作します。私はsizeof(配列)を使って、両方の場所で番号を変更することを忘れるリスクを避けることに注意してください。

+0

ああ、もちろん。ありがとう、相棒! – o01

+1

私は通常、悲観的なアプローチをとり、バッファサイズを過剰に割り当てます。例えば、 'timeString []'を20文字程度のcharsと宣言します。メモリは安く、ここでは余分なバイト数しか話していません。後でフォーマット文字列を変更することに決めたときに、バッファ長を更新するのを忘れてしまったときには、あなたを保存します。 –

+0

コンパイラに配列のサイズを渡すために 'sizeof()'を使用する場合は+1してください。 –

4

strftime関数を見てください。この関数を使用すると、選択した形式で時刻をchar配列に書き込むことができます。

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

/* get seconds since the Epoch */ 
time_t secs = time(0); 

/* convert to localtime */ 
struct tm *local = localtime(&secs); 

/* and set the string */ 
sprintf(timeString, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec); 

時間に対処するための重要なタイプ(時間のウォールクロックタイプではなく、プロセス/スレッド時間)time_tstruct tmです。
一部の作業では、相互に変換することができますが、現地時間とUTC時間に注意する必要があります。あなたは再びC.

で時間を完全に理解まで

熟読description of <time.h>、UTC時刻とローカル時刻に注意を払って、そこの機能を試してみてください。

+0

本質的に安全でない 'sprintf()'の使用を増やすことはできませんか? –

+0

私はちょっと同意します...しかし、上のスニペットではありません...本質的に安全ではない整数の使用を増やすことはできません。 – pmg

関連する問題