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は単なる 1 つの ASCII 文字char*ですが、通常は文字配列、つまり文字列を保持するために使用されるメモリ位置へのポインタです。

値は、タイムスタンプ文字列の最初の文字に由来83する ASCII 文字に対応していましたSSat 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文字列ではなく、ただの 1 文字です。文字列を指す変数を宣言するには、char *.

したがって、次のようになります。

char *thetime;

次に、割り当ては次のようになります。

thetime = asctime(loctime);

の宣言は次のようにtimestampする必要があります。

char *timestamp()

で時刻を出力すると、次のWriteLogようになります。

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

タイムスタンプ関数と時間変数の両方を として宣言しましたchar。これは、-128 から +127 の範囲の整数のみを保持できる 1 バイトの変数です。必要なのは、char *代わりにポインター ( ) であり、asctime によって返される文字列へのポインターを保持して返すことができます。

両方の宣言をcharto に変更し、asctime からの戻りを参照char *する を削除します。*それはそれを修正する必要があります。

于 2013-03-02T06:48:21.777 に答える