0
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 *.

4

3 回答 3

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);
}
于 2013-03-02T06:45:21.697 回答
0

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

所以应该是:

char *thetime;

那么作业应该是:

thetime = asctime(loctime);

的声明timestamp应该是:

char *timestamp()

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

fprintf(&logfile, "%s, %s", timestamp(), Msg);
于 2013-03-02T06:45:45.643 回答
0

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

将两个声明从charto更改为char *并删除*尊重 asctime 的返回的声明。那应该解决它。

于 2013-03-02T06:48:21.777 回答