2

我们在配置文件中使用 /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”。

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

谢谢

4

2 回答 2

0

好好看看 call tostrftime()和 printing之间的代码curr_date。您正在覆盖curr_data某处,因为您打印的内容的开头是正确的。内存管理也可能有问题curr_data;它是如何定义的,你分配内存了curr_data吗?

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

于 2013-06-28T19:08:42.747 回答
0

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

Solaris 标准 (5) 手册页中所述,您需要使用各种 #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) 标准。

于 2013-07-01T03:36:25.557 回答