Estoy tratando de convertir la cadena de tiempo en formato de tiempo en C en Windows. Como solo tengo horas, minutos y segundos en mi cadena, intenté analizar la cadena usando sscanf en formato de hora y luego usé mktime. Pero de alguna manera no lo está convirtiendo en formato de tiempo. Para verificar, traté de imprimir el tiempo convertido en una cadena. El código se parece a:
struct tm tm; char time_buffer[100]; int hh, mm; float ms; time_t time_value; char *timestamp = {"16:11:56.484"}; sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ms); tm.tm_hour =hh; tm.tm_min = mm; tm.tm_sec = ms*1000; tm.tm_isdst = -1; time_value = malloc(100*sizeof(char)); time_value = mktime(&tm); if (time_value==-1) printf ("unable to make time"); strftime(time_buffer, sizeof(time_buffer), "%c", &tm); printf(time_buffer);struct tm , sino que solo configura tm_hour , tm_min , tm_sec y tm_isdst . Todos los demás campos no se inicializan y, por lo tanto, tienen valores desconocidos o indefinidos.struct tm con un memset(&tm, 0, sizeof(tm)) , probablemente aún recibiría un error porque los campos contenidos en la estructura no permiten 0 como valor válido ( tm_mday ). Consulte los documentos como referencia.tm_sec no sea válido. En realidad, desea que sea ms/1000 , no ms*1000 .Antes de llamar a mktime() , el código debe inicializar más de 7 campos de tm_struct() : year, month,day, hour min, sec, isdst y potencialmente otros.
2 excepciones: .tm_yday, .tm_wday no necesitan asignación antes de llamar a mktime() .
El año, el mes y el día deben establecerse en algo razonable: usemos el 1 de enero de 2000. Alternativamente, el código podría usar time_t() para obtener el día de hoy.
El código usa ms insinuando que el valor está en milisegundos. No lo es. Todavía está en segundos.
Utilice la variable time_t local en lugar de asignar una. malloc() no es necesario.
struct tm tm = {0}; tm.tm_year = 2000 - 1900; // Years from 1900 tm.tm_mon = 1 - 1; // Months from January tm.tm_mday = 1; char time_buffer[100]; int hh, mm; float ss; time_t time_value; char *timestamp = "16:11:56.484"; if (sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ss) != 3) Handle_BadData(); tm.tm_hour = hh; tm.tm_min = mm; tm.tm_sec = roundf(ss); // or simply = ss; tm.tm_isdst = 0; // Keep in standard time // time_value = malloc(100*sizeof(char)); time_value = mktime(&tm); if (time_value == -1) { printf ("unable to make time"); } else { strftime(time_buffer, sizeof(time_buffer), "%c", &tm); printf(time_buffer); } // Sat Jan 1 16:11:56 2000