Ctime.h环绕
C time.h wrap around
我想将最大可能时间分配给一个 time_t 变量,然后将其转换为字符串并打印出结果。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime= LONG_LONG_MAX;
char *strOfMaxTime;
*strOfMaxTime = ctime(maxTime);
printf("%s",strOfMaxTime);
return 0;
}
这是错误的:
*strOfMaxTime = ctime(maxTime);
这试图将 ctime
的 return 值(指向字符的指针)分配给 *strOfMaxTime
字符。
改为调用:
strOfMaxTime = ctime(&maxTime);
然后检查 strOfMaxTime
的 return 值,因为如果 ctime
无法转换 maxTime
,它可能为 NULL
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime = INT_MAX;
char *strOfMaxTime = ctime(&maxTime);
printf("%s",strOfMaxTime);
return 0;
}
最大年份是 2038,这就是所谓的 2038 年问题:
https://en.wikipedia.org/wiki/Year_2038_problem
OP 的代码使用 char *ctime(const time_t *timer)
不正确。
time_t maxTime;
char *strOfMaxTime;
// *strOfMaxTime = ctime(maxTime);
strOfMaxTime = ctime(&maxTime);
然而,简单地分配 maxTime= LONG_LONG_MAX;
并不是确定系统可以处理的最长时间的正确方法。
以下是一种试错法 - 可能存在各种实施限制。 localtime()
returns NULL
当 time_t
超出范围时。
#include <stdio.h>
#include <time.h>
time_t max_time() {
time_t t0, t1;
time_t delta = 1;
time(&t0); // now
while (t0 != -1) {
t1 = t0 + delta;
if (localtime(&t1) == NULL) { // If conversion fail, quit doubling.
break;
}
delta *= 2; // 2x for the next increment.
t0 = t1;
}
while (delta) {
t1 = t0 + delta;
if (localtime(&t1) != NULL) { // if succeeds, update t0
t0 = t1;
}
delta /= 2; // try smaller and smaller deltas.
}
printf("%s %lld\n", ctime(&t0), (long long) t0);
return t0;
}
int main(void) {
max_time();
return 0;
}
输出(注意 17:59:59 取决于时区,年份 2,147,483,647 是最大 32 位有符号整数。YMMV。)
Tue Dec 31 17:59:59 2147483647
67767976233532799
The range and precision of times representable in clock_t and time_t are implementation-defined.
首先,您需要解决程序中的问题。以下语句在编译时一定会出错:
*strOfMaxTime = ctime(maxTime);
将此更改为:
strOfMaxTime = ctime(&maxTime);
您可以使用 perror()
获取给定输入的错误消息 - LONG_LONG_MAX
,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#include <errno.h>
int main()
{
time_t maxTime;
maxTime= LONG_LONG_MAX;
char *strOfMaxTime;
strOfMaxTime = ctime(&maxTime);
if (errno != 0)
perror ("Error");
else
printf("%d,%s",errno, strOfMaxTime);
return 0;
}
在我的设置中,我得到了这个输出:
Error: Value too large to be stored in data type
的确,LONG_LONG_MAX
是无效输入。
因为标准提到 time_t
的范围是实现定义的,所以如果我给出 UINT_MAX
我得到输出:
0,Sun Feb 7 11:58:15 2106
其他帖子中指出了许多错误(将 ctime()
的输出分配给 *strOfMaxTime
、LONG_LONG_MAX
等)。在我的 64 位 Ubuntu 16.04 Linux 系统上,time_t
被定义为 long int
,long int
被定义为 8 个字节,long long int
.但是,将 LLONG_MAX
分配给 maxTime
仍然会导致 ctime()
失败。所以我修改了你的代码以获得有效值上限 ctime()
将接受的范围。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime= LONG_MAX;
char *strOfMaxTime;
strOfMaxTime = ctime(&maxTime);
while( strOfMaxTime == NULL )
{
perror("ctime error");
printf("%ld div by 2\n", maxTime);
maxTime /= 2;
strOfMaxTime = ctime(&maxTime);
}
printf("%s\n",strOfMaxTime);
return 0;
}
运行 它产生以下输出:
ctime error: Invalid argument
9223372036854775807 div by 2
ctime error: Invalid argument
4611686018427387903 div by 2
ctime error: Invalid argument
2305843009213693951 div by 2
ctime error: Invalid argument
1152921504606846975 div by 2
ctime error: Invalid argument
576460752303423487 div by 2
ctime error: Invalid argument
288230376151711743 div by 2
ctime error: Invalid argument
144115188075855871 div by 2
ctime error: Invalid argument
72057594037927935 div by 2
Sat Jun 12 22:26:07 1141709097
我想将最大可能时间分配给一个 time_t 变量,然后将其转换为字符串并打印出结果。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime= LONG_LONG_MAX;
char *strOfMaxTime;
*strOfMaxTime = ctime(maxTime);
printf("%s",strOfMaxTime);
return 0;
}
这是错误的:
*strOfMaxTime = ctime(maxTime);
这试图将 ctime
的 return 值(指向字符的指针)分配给 *strOfMaxTime
字符。
改为调用:
strOfMaxTime = ctime(&maxTime);
然后检查 strOfMaxTime
的 return 值,因为如果 ctime
无法转换 maxTime
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime = INT_MAX;
char *strOfMaxTime = ctime(&maxTime);
printf("%s",strOfMaxTime);
return 0;
}
最大年份是 2038,这就是所谓的 2038 年问题: https://en.wikipedia.org/wiki/Year_2038_problem
OP 的代码使用 char *ctime(const time_t *timer)
不正确。
time_t maxTime;
char *strOfMaxTime;
// *strOfMaxTime = ctime(maxTime);
strOfMaxTime = ctime(&maxTime);
然而,简单地分配 maxTime= LONG_LONG_MAX;
并不是确定系统可以处理的最长时间的正确方法。
以下是一种试错法 - 可能存在各种实施限制。 localtime()
returns NULL
当 time_t
超出范围时。
#include <stdio.h>
#include <time.h>
time_t max_time() {
time_t t0, t1;
time_t delta = 1;
time(&t0); // now
while (t0 != -1) {
t1 = t0 + delta;
if (localtime(&t1) == NULL) { // If conversion fail, quit doubling.
break;
}
delta *= 2; // 2x for the next increment.
t0 = t1;
}
while (delta) {
t1 = t0 + delta;
if (localtime(&t1) != NULL) { // if succeeds, update t0
t0 = t1;
}
delta /= 2; // try smaller and smaller deltas.
}
printf("%s %lld\n", ctime(&t0), (long long) t0);
return t0;
}
int main(void) {
max_time();
return 0;
}
输出(注意 17:59:59 取决于时区,年份 2,147,483,647 是最大 32 位有符号整数。YMMV。)
Tue Dec 31 17:59:59 2147483647
67767976233532799
The range and precision of times representable in clock_t and time_t are implementation-defined.
首先,您需要解决程序中的问题。以下语句在编译时一定会出错:
*strOfMaxTime = ctime(maxTime);
将此更改为:
strOfMaxTime = ctime(&maxTime);
您可以使用 perror()
获取给定输入的错误消息 - LONG_LONG_MAX
,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#include <errno.h>
int main()
{
time_t maxTime;
maxTime= LONG_LONG_MAX;
char *strOfMaxTime;
strOfMaxTime = ctime(&maxTime);
if (errno != 0)
perror ("Error");
else
printf("%d,%s",errno, strOfMaxTime);
return 0;
}
在我的设置中,我得到了这个输出:
Error: Value too large to be stored in data type
的确,LONG_LONG_MAX
是无效输入。
因为标准提到 time_t
的范围是实现定义的,所以如果我给出 UINT_MAX
我得到输出:
0,Sun Feb 7 11:58:15 2106
其他帖子中指出了许多错误(将 ctime()
的输出分配给 *strOfMaxTime
、LONG_LONG_MAX
等)。在我的 64 位 Ubuntu 16.04 Linux 系统上,time_t
被定义为 long int
,long int
被定义为 8 个字节,long long int
.但是,将 LLONG_MAX
分配给 maxTime
仍然会导致 ctime()
失败。所以我修改了你的代码以获得有效值上限 ctime()
将接受的范围。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <limits.h>
int main()
{
time_t maxTime;
maxTime= LONG_MAX;
char *strOfMaxTime;
strOfMaxTime = ctime(&maxTime);
while( strOfMaxTime == NULL )
{
perror("ctime error");
printf("%ld div by 2\n", maxTime);
maxTime /= 2;
strOfMaxTime = ctime(&maxTime);
}
printf("%s\n",strOfMaxTime);
return 0;
}
运行 它产生以下输出:
ctime error: Invalid argument
9223372036854775807 div by 2
ctime error: Invalid argument
4611686018427387903 div by 2
ctime error: Invalid argument
2305843009213693951 div by 2
ctime error: Invalid argument
1152921504606846975 div by 2
ctime error: Invalid argument
576460752303423487 div by 2
ctime error: Invalid argument
288230376151711743 div by 2
ctime error: Invalid argument
144115188075855871 div by 2
ctime error: Invalid argument
72057594037927935 div by 2
Sat Jun 12 22:26:07 1141709097