Время в строку в формате ЧЧ: ММ: СС (C-программирование) - PullRequest
5 голосов
/ 07 октября 2009

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

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

EDIT: Так что я попробовал с 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? " в конце?

Ответы [ 3 ]

9 голосов
/ 07 октября 2009

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

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 (массив), чтобы избежать риска забыть изменить число в обоих местах.

5 голосов
/ 07 октября 2009

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

2 голосов
/ 07 октября 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 и местное время.

...