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



我们在配置文件中使用/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/13 Thu Jun 27 02:39:34 PDT",而不是"06/27/1320"。

你知道在这里应该使用什么格式说明符吗?

感谢

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

如Solaris标准(5)手册页中所述,您需要使用各种#定义和编译器标志来指定对各种标准的遵从性。

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

#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("%sn", 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)标准。

仔细查看调用strftime()和打印curr_date之间的代码。您正在某个地方覆盖curr_data,因为您打印的内容的开头是正确的。curr_data的内存管理可能也有问题;它是如何定义的,您为curr_data分配了内存吗?

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