-1

これは、「logf」という名前の関数をテストするコードの一部です。この関数は 2 つの引数を取り、それらを使用して少しの情報をログに記録します。この場合、関数の最初の引数はログに記録される文字列で、2 番目の引数はログ ファイルへのファイル システム内のパスを保持する文字列です。最初の文字列は、タイムスタンプとともに stdout およびログ ファイルに出力されます。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

typedef struct tm tm;

int logf(char input_string[], char log_file_string[])
{
    /*Initializations.*/
    char output_string[32767];
    FILE* log_file_stream;
    time_t current_time_epoch_format;
    tm* current_time_calandar_format;

    /*Creating timestamp in output string, amending first argument to output string, and logging.*/
    if ((strlen(input_string) + 23) > 32767) return EXIT_FAILURE;
    if ((current_time_epoch_format = time(&current_time_epoch_format)) == -1) return EXIT_FAILURE;
    if ((current_time_calandar_format = localtime(&current_time_epoch_format)) == NULL) return EXIT_FAILURE;
    if (strftime(output_string, 23, "[%d-%m-%Y %H:%M:%S] ", current_time_calandar_format) != 22) return EXIT_FAILURE;
    if ((log_file_stream = fopen(log_file_string, "a")) == NULL) return EXIT_FAILURE;
    if (printf("%s\n", strcat(output_string, input_string)) < 1) return EXIT_FAILURE;
    if (fprintf(log_file_stream, "%s\n", output_string) < 1) return EXIT_FAILURE;
    if (fclose(log_file_stream) == EOF) return EXIT_FAILURE;
    return EXIT_SUCCESS;
}

int main(int argc, char** argv)
{
    /*Initializations.*/
    int EXIT_CODE;

    /*Print the returned integer from logf and exit.*/
    printf("%d\n", (EXIT_CODE = logf(argv[1], argv[2])));
    exit(EXIT_CODE);
}
4

1 に答える 1

2

logfこのプログラムは、名前が外部使用のために予約されているため、未定義の動作を引き起こします。これは、標準的な数学関数の 1 つの名前です。私が調べていない他の理由で未定義の動作を引き起こしたかどうか。

于 2012-12-15T23:59:42.723 に答える