C time.h环绕

时间:2017-12-12 03:13:37

标签: c pointers char time.h

我想将最大可能时间分配给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;
}

5 个答案:

答案 0 :(得分:2)

OP的代码错误地使用了char *ctime(const time_t *timer)

time_t maxTime;
char *strOfMaxTime;
// *strOfMaxTime = ctime(maxTime);
strOfMaxTime = ctime(&maxTime);

然而,简单地分配maxTime= LONG_LONG_MAX;并不是确定系统可以处理的最长时间的正确方法。

以下是试错法 - 可能存在各种实施限制。当localtime()超出范围时,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

答案 1 :(得分:2)

来自C Standards#7.27.1p4

  

clock_t和time_t中可表示的时间范围和精度为实现定义

首先,您需要在程序中解决问题。以下语句必须在编译时给出错误:

*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

答案 2 :(得分:1)

这是错误的:

*strOfMaxTime = ctime(maxTime);

这会尝试将ctime(一个指向char的指针)的返回值赋给*strOfMaxTime一个字符。

而是致电:

strOfMaxTime = ctime(&maxTime);

然后检查strOfMaxTime的返回值,因为如果ctime无法转换maxTime

,它可能为NULL

答案 3 :(得分:1)

public static List<string> indexLetter = Enumerable.Range(1, 50)
    .Select(i => string.Format("{0}{1}", RandomLetter(), i))
    .ToList();

最大年份是2038年,这被称为2038年问题: https://en.wikipedia.org/wiki/Year_2038_problem

答案 4 :(得分:1)

其他帖子中指出了许多错误(将ctime()的输出分配给*strOfMaxTimeLONG_LONG_MAX等)。在我的64位Ubuntu 16.04 Linux系统上,time_t定义为long intlong 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