Pergunta

Eu preciso obter o horário atual em um formato "hh: mm: ss" em uma matriz de caracteres (string) para que eu possa gerar o resultado posteriormente simplesmente com um printf("%s", timeString);

Estou muito confuso no timeval e time_t tipos btw, então qualquer explicação seria incrível :)

EDIT: Então eu tentei com o strftime etc, e isso meio que funcionou. Aqui está o meu código:

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);

Mas a saída é a seguinte: "13: 49: 53a ?? J`as?"

O que está acontecendo com o "A ?? J`as?" no final?

Foi útil?

Solução

Você está recebendo lixo deste código:

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);

Como você não está permitindo espaço para um terminador nulo ( 0) na string; portanto, quando a string que ela imprimiu, não sabe onde está o fim e o lixo aleatório inteiro no próximo pedaço de memória como parte da string .

Mude para isso:

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);

E vai funcionar corretamente porque strftime() terá espaço suficiente para adicionar um 0. Observe que estou usando o sizeof (matriz) para evitar o risco de esquecer de alterar o número em ambos os lugares.

Outras dicas

Dê uma olhada no strftime Função, que permite escrever o tempo em uma matriz de char com um formato de sua escolha.

#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);

Os tipos importantes para lidar com o tempo (o tipo de tempo de parede, não o tempo de processo/thread) são time_t e struct tm.
Com algum trabalho, você pode converter entre um e outro, mas você deve prestar atenção ao horário local versus tempo da UTC.

Ler o descrição de <time.h>, tente as funções lá até você Grok Tempo em C.

Novamente, preste atenção ao tempo da UTC e à hora local.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top