Ant*_*ala 0 c msvcrt time.h visual-c++ language-lawyer
我有以下程序演示使用asctime
.
#include <stdio.h>
#include <time.h>
int main(void) {
struct tm broken_down;
broken_down.tm_year = 2000 - 1900;
broken_down.tm_mon = 0;
broken_down.tm_mday = 1;
broken_down.tm_hour = broken_down.tm_min = broken_down.tm_sec = 0;
printf("Current date and time: %s", asctime(&broken_down));
}
Run Code Online (Sandbox Code Playgroud)
此程序Current date and time: Sun Jan 1 00:00:00 2000
在ideone.com上打印,即日期字段是空格填充的.
当我使用MSVC编译并运行该程序时,它会在月份的某一天生成前导零的日期字符串:Current date and time: Sun Jan 01 00:00:00 2000
.
造成这种差异的原因是什么?哪种格式正确?
像往常一样,Microsoft(非)标准C库的作者没有充分考虑正确实现标准字母.
即使在原始标准C89/C90中,也会出现以下文本
描述
该
asctime
函数将指向的结构中的细分时间转换timeptr
为表单中的字符串Run Code Online (Sandbox Code Playgroud)Sun Sep 16 01:03:52 1973\n\0
使用等效的以下算法.
Run Code Online (Sandbox Code Playgroud)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; }
遗憾的是,示例本身使用的是具有2位数月份日期的日期,但代码使用的是在3个字符宽的字段中使用空格填充和右对齐%3d
的十进制数字.
给定故障时间的结果是Sun Jan 1 00:00:00 2000
空间填充.
Python 2,直到2.7.15已经asctime
按原样公开C标准库输出,减少了引起平台相关行为的换行,现在在2.7.15中修复了使用带有前导空格的硬编码格式.Python 2文档也在其示例中使用日期为2位数的日期,这进一步增加了混淆.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |