別のロギング関数の時間を返す必要がある関数があり、次のようになります。
//put time in to buf, format 00:00:00\0
void gettimestr(char buf[9]) {
if(strlen(buf) != 9) { //experimental error checking
fprintf(stderr, "Buf appears to be %d bytes and not 9!\n", strlen( buf ));
}
time_t cur_time;
time(&cur_time);
struct tm *ts = localtime(&cur_time);
sprintf(buf, "%02d:%02d:%02d",
ts->tm_hour,
ts->tm_min,
ts->tm_sec );
strncat(buf, "\0", 1);
}
ここでの主な問題は、バッファが十分に長いかどうかを確認することだと思います。sizeof()はポインタサイズを返し、strlenは2つの異なる呼び出しでランダムに0または12などを返すようです。
私の最初の質問は、バッファのサイズを安全に検出するにはどうすればよいですか、それは可能ですか?
私の他の質問は、buf [9]を受け入れるのが好ましいメソッドですか、それともバッファーへのポインターを受け入れ、sprintf()の代わりにstrcat()を使用して時間を追加する必要がありますか?sprintfを使用すると、時間値にゼロを簡単に埋めることができますが、ポインタは受け入れず、文字配列のみを受け入れるようです。