Время в строке в формате ЧЧ:ММ:СС (программирование на C)
Вопрос
Мне нужно получить текущее время в формате «ЧЧ:ММ:СС» в массив символов (строку), чтобы я мог вывести результат позже просто с помощью printf("%s", timeString);
Я в замешательстве timeval
и time_t
типа, кстати, так что любое объяснение было бы здорово :)
РЕДАКТИРОВАТЬ:Я попробовал использовать strftime и т. д., и это сработало.Вот мой код:
time_t current_time;
struct tm * time_info;
char timeString[8];
time(¤t_time);
time_info = localtime(¤t_time);
strftime(timeString, 8, "%H:%M:%S", time_info);
puts(timeString);
Но вывод такой:"13:49:53а??J`aS?"
Что происходит с "а??J`aS?" в конце?
Решение
Вы получаете мусор из этого кода:
time_t current_time;
struct tm * time_info;
char timeString[8];
time(¤t_time);
time_info = localtime(¤t_time);
strftime(timeString, 8, "%H:%M:%S", time_info);
puts(timeString);
Поскольку вы не оставляете место для нулевого терминатора (\0) в строке, поэтому, когда строка печатается, она не знает, где находится конец, и интерпретирует случайный мусор в следующем бите памяти как часть строки. .
Измените это на это:
time_t current_time;
struct tm * time_info;
char timeString[9]; // space for "HH:MM:SS\0"
time(¤t_time);
time_info = localtime(¤t_time);
strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info);
puts(timeString);
И это будет работать правильно, потому что strftime()
будет достаточно места для добавления \0.Обратите внимание, что я использую sizeof(array), чтобы избежать риска забыть изменить число в обоих местах.
Другие советы
Взгляните на стрфтайм функция, которая позволяет вам записать время в массив символов в выбранном вами формате.
#include <stdio.h>
#include <time.h>
/* get seconds since the Epoch */
time_t secs = time(0);
/* convert to localtime */
struct tm *local = localtime(&secs);
/* and set the string */
sprintf(timeString, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec);
Важными типами для работы со временем (тип времени настенных часов, а не время процесса/потока) являются time_t
и struct tm
.
Приложив некоторые усилия, вы можете конвертировать одно и другое, но вам нужно обратить внимание на местное время и время UTC.
Просмотрите описание <time.h>
, пробуйте функции там, пока не грок время в С.
Опять же, обратите внимание на время UTC и местное время.