10 Temmuz 2019 Çarşamba

asctime metodu - Sabit Formatta String'e Çevirme

Giriş
İmzası şöyle
char* asctime (const struct tm * timeptr);
Bu metod verilen struct tm yapısını yerel saat diliminde string'e çevirir. Metodun çıktısı sabit bir format kullanır.

Format
Bu format şöyledir.
Www Mmm dd hh:mm:ss yyyy  (Baştaki Www haftanın hangi günü olduğunu belirtir.)
Çıktısı aşağıdakine benzer.
Wed Feb 13 15:46:11 2013
Static Bellek
Bu metodlar static bellek alanı döndüğü için multithreaded ortamlarda kullanılmamalı. Açıklaması şöyle.
The specification of the ctime and asctime functions goes back to C89, and things were done a bit different back in those days, mainly because multi-processor systems weren't very common and thus using a static buffer wouldn't cause a big problem.
Örnek
Metodun için şun benzer.
char *asctime(const struct tm *timeptr)
{
  static const char wday_name[7][3] = {
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
  };

  static const char mon_name[12][3] = {
    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  };

  static char result[26];
  sprintf(result,
    "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
    wday_name[timeptr->tm_wday],
    mon_name[timeptr->tm_mon],
    timeptr->tm_mday, timeptr->tm_hour,
    timeptr->tm_min, timeptr->tm_sec,
    1900 + timeptr->tm_year);

  return result;
}

C11
Bu metodlar yerine C11 ile eklenen ctime_s() ve asctime_s() kullanılmalı. İmzaları şöyle.
errno_t ctime_s(char *buffer, rsize_t bufsz, const time_t *time);
errno_t asctime_s(char *buf, rsize_t bufsz, const struct tm *time_ptr);
POSIX
Eğer POSIX veya Linux kullanıyorsak ve C11 yoksa asctime_r() ve ctime_r() kullanılabilir.
İmzaları şöyle.
char *asctime_r(const struct tm *tm, char *buf);
   char *ctime_r(const time_t *timep, char *buf);

Hiç yorum yok:

Yorum Gönder