strftime %F 在Windows上无法正常工作。

4

我正在尝试在Windows上编译这个简单的例子。当我使用%F,它是%Y-%m-%d的缩写时,该进程会无错误消息中止。在Linux上,它像此ideone.com上的实时示例所示一样正常工作。有什么想法吗?

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

int main ()
{
   time_t rawtime;
   struct tm * timeinfo;
   char buffer [80];

   time (&rawtime);
   timeinfo = localtime (&rawtime);

   strftime (buffer,80,"Now it's %F.",timeinfo);
   puts (buffer);

   return 0;
}

2
MSDNstrftime的文档,其中包含支持的格式标志。 - lcs
1个回答

10
%F是C99标准,参考man7上的strftime页面或者对比C99和C90标准。

VS2013库及早期版本中的strftime不符合C99标准,因为它们不接受该格式说明符:MSDN VS2013 strftime页面。也许下一个版本会添加它,因为该格式尚未用于其他任何内容...

只需使用以下格式即可进行快捷方式,这符合C89和VS2013的规范:%Y-%m-%d

引用从C标准中传递给strftime的无效格式说明符:

6 如果转换说明符不是以上之一,则其行为未定义。


4
可以,但不应该崩溃 :) - Engineer2021
@staticx:在C99之前的标准中,格式说明符没有任何限制。即使在C99之后,任何无效的格式说明符也没有限制,“如果转换说明符不是上述之一,则行为未定义。”尽管我通常不会期望它崩溃,但这是真的。 - Deduplicator
在Linux版本的strftime中,它只会打印出它不认识的格式说明符,而不会崩溃。显然,这在VS2013或更高版本中已经得到了修复,因此这可能是与VS2008 CRT有关的问题。 - Engineer2021
这是相当合理和明智的行为。 - Deduplicator
1
在VS2013SP5中,尽管调试器中出现了描述性错误,但它仍会崩溃。但在发布模式下,它只是崩溃了,最不幸的是。 - Ruud van Gaal
对于 Windows 交叉编译器 x86_64-w64-mingw32-g++,行为相同。对于 %T,请替换为 %H:%M:%S。 - Kim Nyholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接