char* asctime (const struct tm * timeptr);
char* ctime (const time_t * timer);
我å‘现time.h
内的许多函数都返回指å‘é™æ€å˜é‡çš„指针,这些é™æ€å˜é‡å¯ä»¥é€šè¿‡å¯¹è¿™äº›å‡½æ•°çš„任何åŽç»è°ƒç”¨æ¥æ›´æ”¹ã€‚è¿™æ„味ç€æˆ‘å¿…é¡»å¤åˆ¶åˆšå¾—到的数æ®ï¼Œè¿™æ˜¯æˆ‘必须执行的é¢å¤–æ“作,这会使这些函数æˆä¸ºçº¿ç¨‹ä¸å®‰å…¨çš„。
为什么以这ç§æ–¹å¼å®žæ–½ï¼Ÿè¿™äº›ç¾å会更好å—?
void asctime (char * out, const struct tm * timeptr);
void ctime (char * out, const time_t * timer);
在开å‘过程ä¸ï¼Œæˆ‘们始终必须åšå‡ºå†³å®šã€‚我åªæ˜¯åœ¨é—®ä¸ºä»€ä¹ˆä»–们选择返回é™æ€æŒ‡é’ˆè€Œä¸æ˜¯å°†â€œè¾“出å˜é‡â€ä½œä¸ºå‚数。
顺便说一å¥ï¼ˆè¿™æ˜¯å¦ä¸€ä¸ªé—®é¢˜ï¼‰ï¼Œä¸ºä»€ä¹ˆä»–们ä¸å°†ç»“果分é…åˆ°å †ä¸Šï¼Ÿæ˜¯å…许使用任何东西代替malloc还是åªæ˜¯ä¸ºäº†æ高效率?
ç”案 0 :(得分:22)
ctime
å’Œasctime
函数的规范å¯ä»¥è¿½æº¯åˆ°C89,那时的情况有所ä¸åŒï¼Œä¸»è¦æ˜¯å› 为多处ç†å™¨ç³»ç»Ÿä¸æ˜¯å¾ˆæ™®éï¼Œå› æ¤ä½¿ç”¨é™æ€ç¼“冲区ä¸ä¼šé€ æˆå¤§é—®é¢˜ã€‚
最有å¯èƒ½çš„是,它们ä¸è¿”回动æ€åˆ†é…的内å˜ï¼Œå› 为这è¦èŠ±è´¹é¢å¤–的时间,并且在那些日å里CPU周期更难实现。
如果您使用的是Linux之类的POSIX系统,则还有å¦å¤–两个å¯ç”¨çš„功能,这些功能基本上就是您æ述的替代功能:
char *asctime_r(const struct tm *tm, char *buf);
char *ctime_r(const time_t *timep, char *buf);
这些函数采用一个指å‘å¯ä»¥æŽ¥æ”¶è¾“出的缓冲区的指针(它们返回一个指å‘该缓冲区的指针)。 _r
åŽç¼€çš„æ„æ€æ˜¯â€œå¯é‡å…¥â€ï¼Œè¿™æ„味ç€å¯ä»¥åœ¨å¤šçº¿ç¨‹ç¨‹åºä¸å®‰å…¨åœ°è°ƒç”¨å®ƒï¼Œä¹Ÿå¯ä»¥å¤šæ¬¡è°ƒç”¨è€Œä¸å¿…在两者之间æ’å…¥åºåˆ—å·ã€‚
ç”案 1 :(得分:12)
 Âè¿™æ„味ç€æˆ‘å¿…é¡»å¤åˆ¶åˆšå¾—到的数æ®
为什么需è¦å¤åˆ¶å®ƒï¼Ÿ
请注æ„,å³ä½¿æ‚¨åœ¨èŽ·å¾—æ•°æ®åŽç«‹å³å¤åˆ¶äº†æ•°æ®ï¼Œæ‚¨ä»ç„¶å¯ä»¥å‚åŠ æ¯”èµ›ã€‚
 Â为什么è¦è¿™æ ·å®žçŽ°ï¼Ÿ
ç”±äºŽæ ‡å‡†åŒ–ï¼ˆ1989),å³ä½¿è‡ªå¤§åž‹æœºæ—¶ä»£èµ·å°±å˜åœ¨å¤šçº¿ç¨‹ï¼Œå¤§å¤šæ•°è½¯ä»¶ä¹Ÿä¸æ˜¯å¤šçº¿ç¨‹çš„。作为å‚è€ƒï¼Œç”šè‡³æ¯”è¿™äº›åŠŸèƒ½æ™šäº†å‡ å¹´ï¼ˆ1996)æ‰ä½¿POSIXçº¿ç¨‹æ ‡å‡†åŒ–ã€‚ç›´åˆ°æ¯å¹´2001-2006æ‰å‡ºçŽ°è®¡ç®—机,并且æ¯å¹´éƒ½æ²¡æœ‰å‡ºçŽ°å¤šæ ¸/ SMT处ç†å™¨ã€‚
如果需è¦å…¶ä»–功能,则å¯ä»¥å§‹ç»ˆä½¿ç”¨ç³»ç»Ÿç‰¹å®šçš„功能。
 Â为什么ä¸å°†ç»“果分é…åˆ°å †ä¸Šï¼Ÿ
分é…éžå¸¸æ˜‚贵。
 Â是å…许使用任何东西代替malloc还是åªæ˜¯ä¸ºäº†æ高效率?
ä¸ç¡®å®šæ‚¨çš„æ„æ€ã€‚æ£ç¡®çš„æ–¹æ³•æ˜¯å°†æŒ‡é’ˆä¼ é€’åˆ°ç›®æ ‡ç¼“å†²åŒºï¼Œä»¥ä¾¿ç”¨æˆ·é€‰æ‹©è¦ä½¿ç”¨çš„分é…方法。
ç”案 2 :(得分:6)
ï¼ˆå‡ ä¹Žï¼‰æ‚¨å°†æè¿°C11ä¸æ·»åŠ çš„_s
å˜ä½“
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);
如果指定的ä½ç½®è¶³å¤Ÿå¤§ï¼Œè¿™äº›å†…容将写入指定的ä½ç½®ï¼Œå¦åˆ™å°†æŠ¥å‘Šé”™è¯¯ã€‚
您ä¸éœ€è¦malloc
æ¥è¿›è¡Œè¿™äº›è°ƒç”¨çš„ç¼“å†²åŒºï¼Œå› ä¸ºæ‚¨çŸ¥é“char buf[26];
æ£æ˜¯éœ€è¦çš„。
ç”案 3 :(得分:5)
C是1970年代åˆçš„产å“,这ç§é—产在这ç§äº‹æƒ…上得到了体现。 strtok
也使用é™æ€ç¼“冲区,既ä¸æ˜¯çº¿ç¨‹å®‰å…¨çš„,也ä¸æ˜¯å¯é‡å…¥çš„。
对于这些功能为何以这ç§æ–¹å¼å®žçŽ°ï¼Œæˆ‘还没有明确的解释。å¯èƒ½æ˜¯ä¸ºäº†èŠ‚çœå †æ ˆç©ºé—´ï¼ˆå½“æ—¶128 kB是很多éžå¸¸æ˜‚贵的内å˜ï¼‰ï¼Œå¯èƒ½æ˜¯ä¸ºäº†é¿å…å¯¹ç›®æ ‡ç¼“å†²åŒºçš„å¤§å°æˆ–有效性进行è¿è¡Œæ—¶æ£€æŸ¥ï¼Œç‰ç‰ã€‚C最åˆæ˜¯ä¸ºç³»ç»Ÿç¼–ç¨‹è®¾è®¡çš„ï¼Œå› æ¤ï¼Œå¦‚æžœè¦è¿›è¡Œå¤§é‡çš„时间计算,则å¯ä»¥çœ‹åˆ°è¿™ç§æ–¹æ³•åœ¨ä¸€å¤©ä¸èŠ‚çœäº†å¤§é‡çš„周期。
ä¸å¹¸çš„是,这是我的推测。我åŒæ„ä¼ é€’ç›®æ ‡ç¼“å†²åŒºæ˜¯æ›´å¥½çš„è§£å†³æ–¹æ¡ˆï¼Œè¿™åº”è¯¥æ˜¯å‰è¿›çš„é“路。