asctime / localtime输出错误

时间:2013-03-02 06:39:28

标签: c datetime

char timestamp()
{
    time_t ltime;
    struct tm * loctime;
    char thetime;
    time(&ltime);
    loctime=localtime(&ltime);
    printf("%s", asctime(loctime));
    // "Sat Mar  2 12:12:57 2013"
    thetime=*asctime(loctime);
    // why "83"?!
    return thetime;
}

void WriteLog(char* Msg, ...)
{
    FILE logfile;
    logfile=*fopen(LOG_FILE, "r+");
    fseek(&logfile, 0, SEEK_END);
    fprintf(&logfile, "%hhd, %s", timestamp(), Msg);
    fclose(&logfile);
}

我觉得这里有一个非常基本的错误。当我打印时间时,它非常好,但当我尝试将其分配给变量以在另一个函数中使用时,我得到83而不是实际的日期和时间,当我从asctime(loctime)中删除星号时,我得到-128并且编译器发出警告:Incompatible pointer to integer conversion assigning to 'char' from 'char *'; dereference with *

3 个答案:

答案 0 :(得分:0)

char只是一个ASCII字符,而char*是指向通常用于保存字符数组(即字符串)的内存位置的指针。

值为83,对应于来自时间戳字符串S的第一个字符的ASCII字符Sat Mar 2 12:12:57 2013

而是尝试直接返回char*的代码,该代码可用于写入日志文件。

char* timestamp()
{
    time_t ltime;
    struct tm * loctime;
    char thetime;
    time(&ltime);
    loctime=localtime(&ltime);
    printf("%s", asctime(loctime));
    // "Sat Mar  2 12:12:57 2013"
    return asctime(loctime);
}

void WriteLog(char* Msg, ...)
{
    FILE logfile;
    logfile=*fopen(LOG_FILE, "r+");
    fseek(&logfile, 0, SEEK_END);
    fprintf(&logfile, "%hhd, %s", timestamp(), Msg);
    fclose(&logfile);
}

答案 1 :(得分:0)

char只是一个字符,而不是字符串。要声明指向字符串的变量,必须使用char *

所以它应该是:

char *thetime;

然后分配应该是:

thetime = asctime(loctime);

timestamp的声明应该是:

char *timestamp()

当您在WriteLog中打印时间时,应该是:

fprintf(&logfile, "%s, %s", timestamp(), Msg);

答案 2 :(得分:0)

您已将时间戳功能和时间变量都声明为char。这是一个1字节的变量,只能保存-128到+127范围内的整数。你想要的是一个指针(char *),以便他们可以保持并返回指向asctime返回的字符串的指针。

将两个声明从char更改为char *,然后删除那些因asctime而返回的*。那应该解决它。