Время в виде строки в формате ЧЧ:ММ:СС (программирование на C)

Мне нужно получить текущее время в формате «ЧЧ: ММ: СС» в массив символов (строку), чтобы я мог вывести результат позже просто с помощью printf("%s", timeString);

Между прочим, я немного запутался в типах timeval и time_t, поэтому любое объяснение было бы потрясающим :)

РЕДАКТИРОВАТЬ: Итак, я попробовал strftime и т. Д., И это сработало. Вот мой код:

time_t current_time;
struct tm * time_info;
char timeString[8];

time(&current_time);
time_info = localtime(&current_time);

strftime(timeString, 8, "%H:%M:%S", time_info);
puts(timeString);

Но вывод такой: "13:49:53a??J`aS?"

Что происходит с "a??J`aS?" в конце?


person o01    schedule 07.10.2009    source источник


Ответы (3)


Вы получаете мусор из этого кода:

time_t current_time;
struct tm * time_info;
char timeString[8];

time(&current_time);
time_info = localtime(&current_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(&current_time);
time_info = localtime(&current_time);

strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info);
puts(timeString);

И это будет работать правильно, потому что strftime() будет достаточно места для добавления \0 . Обратите внимание, что я использую sizeof(array), чтобы избежать риска забыть изменить число в обоих местах.

person John Carter    schedule 07.10.2009
comment
Обычно я придерживаюсь пессимистического подхода и преувеличиваю размер буфера. Например, я бы объявил timeString[] равным примерно 20 символам. Память дешевая, и мы говорим здесь только о нескольких дополнительных байтах. И это спасает вас, когда вы позже решите изменить строку формата, но забудете обновить длину буфера. - person David R Tribble; 08.10.2009
comment
+1 за использование sizeof(), чтобы позволить компилятору передать размер массива. - person Randall Cook; 17.02.2012

Взгляните на функцию strftime, которая позволяет записывать время в массив символов с форматом по вашему выбору.

person sepp2k    schedule 07.10.2009

#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>, пробуйте там функции, пока не Время grok в C.

Опять же, обратите внимание на время UTC и местное время.

person pmg    schedule 07.10.2009
comment
Разве мы не должны делать все возможное, чтобы не распространять использование изначально небезопасного sprintf()? - person Randall Cook; 17.02.2012
comment
Я вроде как согласен... но... не во фрагменте выше... не должны ли мы сделать все возможное, чтобы не распространять использование изначально небезопасного сложения целых чисел? - person pmg; 17.02.2012