2013-04-23 9 views
2

我正在解决其中当前时间戳由400000007 sqaured再分,而其余被转换成DAT时间低于 SPOJ问题 为i所使用的技术..转换长的数字日期,时间用C

所示
remainder = result%4000000007 ; 

printf("%ul\n",remainder); 


//convert the timestamp into date , time 

dt = localtime(&remainder); 
// use any strftime format spec here 
// strftime(b, sizeof(b), "%m%d%H%M%y", dt); 
// fprintf(stdout, "%s", b); 
// printf("%s\n",asctime(localtime(&remainder))); 
ltime = (time_t)remainder; 
printf("%s\n",asctime(dt)); 
printf("%s\n",ctime(&ltime)); 

错误是分段故障,在asctime,也ltime是time_t的变量,“b”是一个缓冲器,dt是结构TM *,并且还我试图余量转换成time_t变量,但仍然力工作。此外,评论代码显示了我的尝试。 使用调试器,我发现asctime返回null。

问题在哪里?

+1

余数和结果至少是一个long long(64位整数)?此外,所有启用/ wAll的编译器警告? – 2013-04-23 23:09:40

+0

是的,他们是无符号long long – Subbu 2013-04-23 23:12:04

+0

@MichaelDorgan:但我不知道他们是否是64位 – Subbu 2013-04-23 23:17:56

回答

1

很难说所提供的代码究竟出了什么问题。但是,在您的意见中,您认为remainder的类型为unsigned long long。但是,您将其地址传递给localtime(),这是一个错误。 localtime()预计time_t *

可能发生的情况是,由于传入的类型错误,localtime()检测到一些错误并返回了NULL值。然后,将此值传递到asctime()导致返回值为NULL

顺便说一句,您的printf的指定错误。使用%llu打印unsigned long long

+1

是的,因此我/墙的建议。警告真的很重要:) – 2013-04-23 23:33:49

+0

@MichaelDorgan:Word。 – jxh 2013-04-23 23:38:50

+0

@MichaelDorgan,@ user315052:如果时间戳由用户给出,那么我们需要将字符串输入转换为类型'time_t',那么我可以使用'strtoull'来达到这个目的吗?我的意思是,如何将输入直接扫描到'time_t'变量中? – Subbu 2013-04-23 23:40:19