1

这是我的 detab 版本,来自这个 K&R 练习:

修改 detab 以接受制表位列表作为参数。如果没有参数,请使用默认选项卡设置。

#include <stdio.h>
#include <stdlib.h>
#define TAB_STOP 8

/* replaces tabs from input with the proper amount of blank spots */
int Detab()
{
     int c, x;
     int column;
     x = column = 0;

     while((c=getchar())!=EOF)
     {
        if(c == '\n') /* reseting counter if newline */
        {
            putchar(c);
            return 1;
        }
        else if(c!='\t')  /* column counts places to tab spot */
        { 
             putchar(c);
             column++; 

             if(column == TAB_STOP) 
             column = 0;
        }
        else /* tab */
        {
           for(x=0; x<TAB_STOP - column; x++)
           putchar('_');

           column = 0;
        } 
     }
     return 0;
}
int main(int argc, char *argv[])
{
     int valid;

     while((valid=Detab())!=0);

     printf("Press any key to continue.\n");
     getchar();
     return 0;
}

我的问题是,如果有多个参数——例如 5、8、10——假设下一个制表位何时开始处于活动状态?程序应该在什么时候开始使用 TAB_STOP 8 而不是开始的 5?在换行之后或者我应该怎么做?

我也不确定是否应该将所有这些都放入 main 中,还是应该坚持使用单独的功能?

编辑:好的,这就是我尝试过的。

#define MAX_ARGUMENTS 100
int main(int argc, char *argv[])
{
     int i, val = 0;
     int nums[MAX_ARGUMENTS];
     int x = 0;

     for(i = 1; i < argc; i++) {

           while(isdigit(*argv[i])) {
             val = val * 10 + *argv[i] - '0';
             *++argv[i];
           }

           nums[x++] = val;
           val = 0;

     }

     Detab(nums);       


     printf("Press any key to continue.\n");
     getchar();
     return 0;
}

我在正确的轨道上吗?这能行吗?我还没有修改detab。

4

3 回答 3

1

制表位列表指定特定列,而不是制表位之间的距离。也就是说,如果列表是 5、8、10,则位置 1-4 的选项卡应将光标置于 5,位置 5-7 应将光标置于 8,而位置 8-9 将光标置于 10。参数列表的每个换行符都应该从第一个制表位重新开始。最后定义的制表位之后的行上的行为取决于您,通常您会回到某个默认的制表位间隔。

于 2010-01-07T23:05:14.490 回答
0

我将 TABSTOP 5 8 10 解释为在 5 th、 8 th和 10 th列有制表位(之后,每 8 列,或您使用的任何默认值。有待商榷是否第 10 列之后的下一个制表位应该在第 18 列(8 个空格之后)或 16(默认 8 的下一个倍数)。

于 2010-01-07T23:04:38.763 回答
0

在您设计它时,您在这里有一些余地;然而,最流行的方法是在最后提供的宽度之后继续使用默认宽度。

例如,如果提供 [5, 8, 10] 并且默认值为 8,它将继续为 [5, 8, 10, 18, 26, 34, ...] 或 [5, 8, 10, 16, 24, 32, ...],取决于偏好。

请注意,我使用这些数字作为制表位,而不是宽度。所以 [5, 8] 意味着第一个停靠点在 5 处,宽度为 5,第二个停靠点在 8 处,宽度为3

于 2010-01-07T23:06:28.013 回答