dc print 为什么会分割长数字

dc print 为什么会分割长数字

运行该dc实用程序时,如果我输入一个非常大的数字,请说:

9999999999999999999999999999999999999999999999999999999999999999999999999

当我使用 打印出来时p,我得到:

999999999999999999999999999999999999999999999999999999999999999999999\
999

为什么它在 69 位之后分割输出?

答案1

至少对于 的 GNU 实现来说dc,有 70 个字符的硬编码DEFAULT_LINE_MAX- 尽管可以通过设置DC_LINE_LENGTH环境变量来覆盖它。从dc/numeric.c

559 static int out_col = 0;
560 static int line_max = -1;       /* negative means "need to check environment" */
561 #define DEFAULT_LINE_MAX 70
562 
563 static void
564 set_line_max_from_environment(void)
565 {
566         const char *env_line_len = getenv("DC_LINE_LENGTH");
567         line_max = DEFAULT_LINE_MAX;
568         errno = 0;
569         if (env_line_len) {
570                 char *endptr;
571                 long proposed_line_len = strtol(env_line_len, &endptr, 0);
572                 line_max = (int)proposed_line_len;
573 
574                 /* silently enforce sanity */
575                 while (isspace(*endptr))
576                         ++endptr;
577                 if (*endptr || errno || line_max != proposed_line_len
578                                         || line_max < 0 || line_max == 1)
579                         line_max = DEFAULT_LINE_MAX;
580         }
581 }
582 

所以

$ dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999\
999
q

$ DC_LINE_LENGTH=0 dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999999
q
$ 

答案2

终端传统上是 80x24(左右),在这样的环境中,长行换行可能会出现问题,这可能解释了 UNIX 传统的换行长行并用\.

这是一个非常古老的限制,dc(1)版本 6 AT&T UNIX来源包含:

dc1.s:ll:   70.         /line length

(从事复古计算的人可能能够详细地告诉您为什么长行是一个问题;人们可能会怀疑当时的行式打印机可能没有神奇的长行换行功能,因此要正确打印某些内容,它确实需要需要适合页面...)

相关内容