0

C プログラムにログ ファイルがあり、ユーザーがクエリを実行するたびにエントリを作成しようとしています。日付と時刻を 1 行に出力し、アクティビティ文字列をその下の行に出力する以外は機能します。エントリ全体を 1 行に出力する必要があります。私はすべてを試しましたが、なぜうまくいかないのかわかりません。time_string と関係があると思います。誰か助けてください。コードを以下に示します。

/*
 * This function writes a log to the log file.
 */
 void write_log(char *activity) {
     FILE *lf;
     time_t current_time;
     char *time_string;

     current_time = time(NULL);
     time_string = ctime(&current_time);
     strcat(time_string, activity);
     lf = fopen("logs.txt", "a+");
     fprintf(lf, "%s\n", activity);
     fclose(lf);
 }

関数はメインで呼び出され、アクティビティの文字列リテラルが渡されます。

4

4 に答える 4

4

man ctimeから:

呼び出しctime(t)は と同等asctime(localtime(t))です。カレンダーの時間を"Wed Jun 30 21:49:08 1993\n"tという形式の null で終わる文字列に 変換します。

そのため\n、結果の文字列に文字が含まれます。改行文字を削除する必要があります。

char* nl = strrchr(time_string, '\n');
if (nl) *nl = '\0';

また、同じリンクされた参照ページから、注目に値します。

戻り値は、静的に割り当てられた文字列を指します。この文字列は、以降の日付および時刻関数の呼び出しによって上書きされる可能性があります。

これは前述の理由から重要であり、そのバッファがどれだけ大きいかは不明であるため、strcat()バッファ オーバーランの可能性があるため、ターゲットとして使用することは安全ではありません。strcat()改行文字の削除を実行する代わりに、ファイルへの 2 つの書き込みを実行します。1 つは 用、time_stringもう 1 つは 用activity\nです。

于 2013-03-18T17:08:41.027 に答える
1

どうですか

fprintf(lf, "%.*s %s\n", strlen(time_string) - 1, time_string, activity);

指定された精度は文字列の長さ - 1 であるため、ウィルは time_string の末尾の%.*s改行を削除します。

于 2013-03-18T17:20:53.643 に答える
1

によって返される文字列はctime、改行で終わります。を参照してくださいctime(3)

ctimeまた、 C ライブラリで使用される静的バッファであるによって返される文字列を変更しようとしています。これにより、バッファ オーバーフローが発生する可能性があります。

于 2013-03-18T17:12:55.633 に答える
0
void write_log(char *activity) 
{

     FILE *lf;
     time_t current_time;
     char *time_string;
     int length = 0;
     char *line = NULL;

     current_time = time(NULL);
     time_string = ctime(&current_time);
     length = strlen(time_string) + strlen(activity) + 1;
     line = (char *)malloc(length);
     if(line){
        memset(line,'\0',length);
        strncpy(line,time_string, strlen(time_string)-1);
        strcat(line," ");
        strcat(line,activity); 
        lf = fopen("logs1.txt", "a+");
        fprintf(lf, "%s\n", line);
        fclose(lf);
        free(line);
     }
 }
于 2013-03-18T17:44:31.650 に答える