Dc

dc print 怎麼會拆分長號

  • February 8, 2018

執行該dc實用程序時,如果我輸入一個非常大的數字,請說:

999999999999999999999999999999999999999999999999999999999999999999999999

當我使用 列印出來時p,我得到:

999999999999999999999999999999999999999999999999999999999999999999999\
999

為什麼它會在 69 位後拆分輸出?

至少對於 的 GNU 實現dc,有DEFAULT_LINE_MAX70 個字元的硬編碼 - 儘管可以通過設置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
$ 

終端傳統上是 80x24(左右),在這樣的運動場中,換行的長行可能會出現問題,這可能解釋了 Unix 傳統的換行長行並用\.

這是一個非常古老的限制,dc(1)在第6 版 AT&T UNIX原始碼中包含:

dc1.s:ll:   70.         /line length

(復古計算方面的人可能會詳細告訴你為什麼長行是個問題;有人可能會懷疑,當時的行式列印機可能沒有神奇的換行功能,所以要正確列印一些東西,它真的會需要適合頁面…)

引用自:https://unix.stackexchange.com/questions/422673