Почему sscanf () не сканирует здесь? - PullRequest
1 голос
/ 21 января 2020

У меня есть структура Log:

struct Log
{
    char message[1024];
    struct tm* time;
    char proc_name[256];
    char computer_name[256];
    int proc_pid;
};

Я инициализирую ее:

char buf[1024];
struct Log* log = malloc(sizeof(struct Log));
log->time = malloc(sizeof(struct tm));

И я пытаюсь прочитать информацию из строки в структуру Log, используя эту функцию:

void SyslogParse(const char* src, struct Log* log)
{
    strptime(src, "%b  %d %T", log->time);   //strptime WORK CORRECT!
    int a = sscanf(src, "%s %d %d:%d:%d %s %s[%d]: %[^\n]s", NULL, NULL, NULL, NULL, NULL, &log->computer_name, &log->proc_name, &log->proc_pid, &log->message);
};

Или это:

void SyslogParse2(const char* src, struct Log* log)
{
    strptime(src, "%b  %d %T", log->time);  //strptime WORK CORRECT!
    int a = sscanf(src, "%s %d %d:%d:%d %s %s: %[^\n]s", NULL, NULL, NULL, NULL, NULL, log->computer_name, log->proc_name, log->message);
};

Строки, прочитанные из файла системного журнала. Например:

21 января 17:58:04 bogdasar-System-Product-Name-anacron [786]: задание `cron.daily 'прекращено

21 января 17:58:24 bogdasar-System-Product-Name 05efi: debug: / dev / sda2 - это раздел FAT32

Функции вызываются следующим образом:

SyslogParse2(buf, log);

Проблема : sscanf в SyslogParse функции не работают !!!

Полный код основного номера:

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "DateTime.h"
#include "Log.h"
#include "Keys.h"
#define SIZE 1024

int main(int argc, char* argv[])
{
    FILE* fl;   
    char buf[1024];     
    //time_t d = time(NULL);

    struct Keys keys;   
    struct tm* time = malloc(sizeof(struct tm));    
    struct Log* log = malloc(sizeof(struct Log));   

    log->time = malloc(sizeof(struct tm));  
    keys.time = malloc(sizeof(struct tm));  

    int opt;
    char args[] = "hd:t:";
    if(argc < 2)
    {
        fprintf(stderr, "Введите абсолютный путь к файлу\n");
        return -1;
    };

    if((fl = fopen(argv[1], "r")) == NULL)
    {
        fprintf(stderr, "Не удаётся открыть файл. Возможно его не существует. Проверьте правильность пути.\n");
        return -2;
    };

    while ((opt = getopt(argc, argv, args)) != -1)
    {
        switch (opt)
        {
        case 'h':
            system("cat help.txt");
            return 0;
        case 'd':
            keys.f_date = 1;
            strptime(optarg, "%b/%d", keys.time);    
            break;
        case 't':
            keys.f_time = 1;
            strptime(optarg, "%T", keys.time);
            break;
        default:
            break;
        }
    };


    while (fgets(buf, SIZE, fl))
    {
        SyslogParse2(buf, log);

    };
    return 0;   
}

Log.h

#ifndef LOG
#define LOG
#define SIZE 1024
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
struct Log
{
    char message[1024];
    struct tm* time;
    char proc_name[256];
    char computer_name[256];
    int proc_pid;
};

void SyslogParse(const char* src, struct Log* log);

void SyslogParse2(const char* src, struct Log* log);
#endif

Log. c

#include "Log.h"
#define _XOPEN_SOURCE
void SyslogParse(const char* src, struct Log* log)
{
    strptime(src, "%b  %d %T", log->time);
    int a = sscanf(src, "%s %d %d:%d:%d %s %s[%d]: %[^\n]s", NULL, NULL, NULL, NULL, NULL, &log->computer_name, &log->proc_name, &log->proc_pid, &log->message);
};

void SyslogParse2(const char* src, struct Log* log)
{
    strptime(src, "%b  %d %T", log->time);
    int a = sscanf(src, "%s %d %d:%d:%d %s %s: %[^\n]s", NULL, NULL, NULL, NULL, NULL, log->computer_name, log->proc_name, log->message);
};

A проблема : sscanf в SyslogParse функции не работают !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...