Странный персонаж в начале регистрации - C - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь войти, когда пользователь что-то делает в файле журнала, с указанием даты, однако, когда я делаю это, в начале каждого журнала я получаю странный символ.

        char log[200];
        char datetime[200];
        time_t now = time(NULL);
        strftime(datetime,200,"%x %X", localtime(&now));
        strcat(log,datetime);
        sendline[strlen(sendline)-1] = 0;
        strncat(log," - ",3);
        strcat(log,sendline);
        recvline[strlen(recvline)-1] = 0;
        strncat(log," - ",3);
        strcat(log,recvline);
        strncat(log,"\n",1);
        fprintf(fp,"%s",log);

Это символ, который я получаю с каждой записью

This is the symbol I am getting with each entry

Как я могу решить эту проблему и почему это происходит?

1 Ответ

3 голосов
/ 19 января 2020

log неинициализируется при вызове strcat(log,datetime); Следовательно, неопределенное поведение.

    char log[200];
    char datetime[200];
    time_t now = time(NULL);
    strftime(datetime,200,"%x %X", localtime(&now));
    strcat(log,datetime);

Или, точнее, в log, вероятно, есть символ мусора в результате объявления массива стека - сбора всего, что происходит в стеке. Исправить это просто. Измените вызов strcat на strcpy:

    strcpy(log,datetime);

В качестве альтернативы вы могли бы сделать свой код более эффективным, используя меньше вызовов strcat и избегая избыточных копий строк (и потенциальных переполнений буфера). Рассмотрите это как альтернативу тому, что вы уже написали:

    char datetime[200];
    time_t now = time(NULL);
    strftime(datetime,200,"%x %X", localtime(&now));
    sendline[strlen(sendline)-1] = 0;
    recvline[strlen(recvline)-1] = 0;
    fprintf(fp, "%s -  %s - %s\n", datetime, sendline, recvline);
...