strftime没有使用%C选项提供正确的输出 - Solaris 10

时间:2013-06-28 18:55:30

标签: c solaris strftime

我们在配置文件中使用/ usr / xpg4 / bin作为默认路径。 我们在这里打印变量“curr_date”的输出:

   lt = time(NULL);
   ltime=localtime(localtime(&lt));
   strftime(curr_date,sizeof(curr_date),"%m/%d/%y%C",ltime);

我们得到的输出为“06/27 / 13Thu Jun 27 02:39:34 PDT”而不是“06/27/1320”。

你知道应该在这里工作的格式说明符是什么吗?

由于

2 个答案:

答案 0 :(得分:0)

仔细查看调用strftime()和打印curr_date之间的代码。你在某处覆盖curr_data,因为你打印的内容是正确的。 curr_data的记忆管理也可能是一些可疑的东西;它是如何定义的,你为curr_data分配了内存吗?

strftime()之后设置一个断点,你会看到它包含预期/正确的字符串。

答案 1 :(得分:0)

在$ PATH中使用/usr/xpg4/bin仅选择符合标准的命令,它不会更改程序中的函数调用以使用符合标准的版本。

Solaris standards(5) man page中所述,您需要使用各种#defines和编译器标志来指定各种标准的合规性。

例如,获取代码片段并将其扩展到此独立测试程序:

#include <sys/types.h>
#include <time.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    time_t lt;
    struct tm *ltime;
    char curr_date[80];

    lt = time(NULL);
    ltime = localtime(&lt);
    strftime(curr_date, sizeof(curr_date), "%m/%d/%y%C", ltime); 
    printf("%s\n", curr_date);
    return 0;
}

然后使用不同的标志进行编译会显示不同的行为:

% cc -o /tmp/strftime /tmp/strftime.c
% /tmp/strftime
06/30/13Sun Jun 30 20:28:00 PDT 2013

% cc -xc99 -D_XOPEN_SOURCE=600 -o /tmp/strftime /tmp/strftime.c
% /tmp/strftime
06/30/1320

默认模式向后兼容传统的Solaris代码,第二种形式要求符合C99和XPG6(Unix03)标准。