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

StackOverflow https://stackoverflow.com/questions/1531055

  •  20-09-2019
  •  | 
  •  

Вопрос

Мне нужно получить текущее время в формате «ЧЧ:ММ:СС» в массив символов (строку), чтобы я мог вывести результат позже просто с помощью 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:53а??J`aS?"

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

Это было полезно?

Решение

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

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

Другие советы

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

#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 и местное время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top