【问题标题】:strftime %F does not work on Windowsstrftime %F 在 Windows 上不起作用
【发布时间】:2014-11-01 19:04:56
【问题描述】:

我正在尝试在 Windows 上编译这个简单的示例。当我使用%F(它是%Y-%m-%d 较长形式的快捷方式)时,进程中止且没有错误消息。在 Linux 上,它可以像 this live example shows on 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;
}

【问题讨论】:

  • MSDN 有关于 strftime 的文档,其中包括它支持的格式标志。

标签: c++ linux windows visual-studio-2008 cygwin


【解决方案1】:

%F 是 C99,请参阅 strftime on man7 或自行比较 C99 和 C90 标准。

VS2013 及更早版本库中的strftime 不符合 C99,因为它们不接受该格式说明符:MSDN VS2013 strftime page
也许下一个版本会添加它,因为该格式还没有用于其他任何东西......

直接使用它的快捷方式,即符合 C89 和 VS2013 的格式:%Y-%m-%d

引用从 C 标准传递给 strftime 的无效格式说明符会发生什么:

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

【讨论】:

  • 是的,但它不应该崩溃:)
  • @staticx:标准中没有限制格式说明符在 C99 之前的作用。即使在 C99 之后“6 如果转换说明符不是上述之一,则行为未定义”,任何无效格式说明符的作用都没有任何限制。虽然我通常不认为它会崩溃,但确实如此。
  • 在 Linux 版本的 strftime 中,它只是打印出它无法识别的格式说明符。没有崩溃。显然这在 VS2013 或更高版本中已修复,因此这可能是 VS2008 CRT 的问题。
  • 这是相当理智的行为。
  • 在 VS2013SP5 中它仍然崩溃,尽管在调试器中有描述性错误。但在发布模式下它只是崩溃,最不幸的是。
猜你喜欢
  • 2014-08-29
  • 2015-06-26
  • 2020-10-24
  • 1970-01-01
  • 2012-09-15
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多