рассчитать разницу времени двух строк времени в c? - PullRequest
0 голосов
/ 15 января 2020

У меня есть такой файл:

start 2020-01-13 02:43:39
ende 2020-01-13 02:44:26
start 2020-01-13 02:50:24
ende 2020-01-13 02:50:26
start 2020-01-13 02:50:24
ende 2020-01-13 02:50:26

Теперь я пытаюсь написать код, который вычисляет разницу во времени между временем начала и окончания. Пока это мой код.

char * line = NULL;
    size_t len = 0;
    char * command = malloc(MAXCHAR * sizeof(char));

    struct tm result;

    time_t loctime, loc;

    char *buff_date = malloc(30);
    int s=0, e=0;
    while (getline(&line, &len, fp) != -1) { //go trough file and read it line by line
        if(strncmp("start", line, 5) == 0){ //start
            strptime(strncpy(buff_date, line+6, 19), "%c", &result);
            buff_date[19] = '\0';
            s=1; //start command was found
            loc = mktime(&result);

        } else if(strncmp("ende", line, 4) == 0){ //end
            strptime(strncpy(buff_date, line+5, 18), "%c", &result);
            buff_date[19] = '\0';
            e=1; //end command was found
            loctime = mktime(&result);

        }


        if(s == 1 && e == 1){ //I have a command and a start, now calculate diff time
            printf("Difference is  %.2f seconds\n", difftime(loctime, loc)); 
            s = 0;//reset
            e = 0; //reset
        }   
    }

Моя проблема в том, что я всегда получаю в результате следующее:

Difference is  0.00 seconds
Difference is  0.00 seconds
Difference is  0.00 seconds

Может кто-нибудь помочь мне найти ошибку или кто-то скажет мне, как Я могу сделать это лучше?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Очистить result перед каждым strptime() вызовом.

memset(&result, 0, sizeof result);
result.tm_isdst = -1;   // usually DST flag is unknown in the data just read
strptime(strncpy(buff_date, line+6, 19), "%c", &result);

Неинициализированный мусор в result мешает localtime().

ref

В принципе, эта функция не инициализируйте tm, но хранит только указанные значения. Это означает, что tm должен быть инициализирован перед вызовом.


@ Clifford совет хороший. Если данные файла имеют фиксированный формат, избегайте "%c" с его языковыми зависимостями.


Улучшение проверки ошибок. Результаты проверки strptime(), mktime().


Minor: используйте strncmp("start ", line, 6), чтобы не подвергаться UB с strncmp("start", line, 5), который возникает, когда line равен "start", а затем line+6 начинается после строки.

0 голосов
/ 15 января 2020

Если вы используете ответ Клиффорда, чтобы изменить две строки кода на: strptime(strncpy(buff_date, line + 6, 19), "%Y-%m-%d %H:%M:%S", &result); strptime(strncpy(buff_date, line + 5, 19), "%Y-%m-%d %H:%M:%S", &result);, тогда у вас будет работающая программа (но без надлежащей проверки ошибок).

...