修改detab以接受制表位列表

时间:2010-01-07 22:52:08

标签: c kernighan-and-ritchie tabstop

这是我从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?换行后或我该怎么做?

我也不确定我是否应该把所有这些都放到主要位置,还是应该坚持使用单独的功能?

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

#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;
}

我是在正确的轨道上吗?这可以吗?我还没有修改过详细信息。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我将TABSTOP 5 8 10解释为意味着在5 th ,8 th 和10 th 列中有制表位(之后,每8列,或者你使用的任何默认值。可以看到第10列之后的下一个标签是否应该在第18列(后面8个空格)或16(默认的下一个倍数) 8)。

答案 2 :(得分:0)

你在这里有一些余地,因为你正在设计它;但是,最流行的方法是在最后提供的宽度之后继续使用默认宽度。

例如,如果提供[5,8,10]且默认值为8,则会继续[5,8,10,18,26,34,...]或[5,8,10] ,16,24,32,...],视喜好而定。

请注意,我使用这些数字作为制表符停止,而不是 widths 。所以[5,8]表示第一站是5,宽度是5,第二站是8,宽度 3