difftime, sajat adatokkal, hogyan?

Fórumok

Sziasztok!

Akadt itt egy kis C-beli problemam, amire napok ota nem talalok megoldast...

Szoval azt szeretnem, hogy stdinrol olvasok "HH:MM HH:MM" formatumu inputot es ki kellene iratnom a 2 idopont kozott eltelt masodperceket. Nezegettem, googleoztam csomot, de egyszeruen nem mukodik, amit osszehoztam...

A kod, ami (most meg teszteles miatt kezzel allitva ugyan) kiszamolna a 2 idopont kozt eltelt idot:


#include<time.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
	struct tm *timestart;
	struct tm *timefinish;

	time_t rawtimestart;
	time(&rawtimestart);
	timestart = localtime(&rawtimestart);
		timestart->tm_hour=10;
		timestart->tm_min=20;
		timestart->tm_sec=0;
	printf("%s", asctime(timestart));

	time_t rawtimefinish;
	time(&rawtimefinish);
	timefinish = localtime(&rawtimefinish);
		timefinish->tm_hour=20;
		timefinish->tm_min=0;
		timefinish->tm_sec=0;
	printf("%s", asctime(timefinish));
	
	double secselapsed = difftime(mktime(timestart), mktime(timefinish));
	printf("%d", secselapsed);
	return 0;
}

az elso ket kiiratas tokeletes, azt kapom, amit szeretnek (mai nap, a beallitott ora, perc, mp), azonban a difftime-mal akarmit csinalok 0-t ad.

Tudnatok segiteni egy kicsit, hogy hogyan probalkozzak?

Hozzászólások

double secselapsed = ...;
printf("%d", secselapsed);

Talán %d helyett %f :)

A localtime-vel van a baj. Részlet a manualból:

"The return value points to a statically allocated struct which might be overwritten by subsequent calls to any of the date and time functions."

Némi módosítás után már működik:


#include<time.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
	struct tm *timestart;
	struct tm *timefinish;

	time_t rawtimestart;
	time(&rawtimestart);
	timestart = localtime(&rawtimestart);
		timestart->tm_hour=10;
		timestart->tm_min=20;
		timestart->tm_sec=0;
	time_t _timestart = mktime(timestart);
	printf("%s", asctime(timestart));

	time_t rawtimefinish;
	time(&rawtimefinish);
	timefinish = localtime(&rawtimefinish);
		timefinish->tm_hour=20;
		timefinish->tm_min=0;
		timefinish->tm_sec=0;
	time_t _timefinish = mktime(timefinish);
	printf("%s", asctime(timefinish));
	
	double secselapsed = difftime(_timestart, _timefinish);
	printf("%f", secselapsed);
	return 0;
}