代码之家  ›  专栏  ›  技术社区  ›  Tool

修改detab以接受制表位列表

  •  1
  • Tool  · 技术社区  · 16 年前

    这是我的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;
    }
    

    我也不确定是否应该将所有这些都放到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。

    3 回复  |  直到 11 年前
        1
  •  0
  •   Jerry Coffin    16 年前

    我将TABSTOP 5 8 10解释为在5处有TABSTOP th 8. ,及 列(之后,每8列,或任何您用作默认值的列)。第10列之后的下一个制表位是在第18列(后面8个空格)还是在第16列(默认8的下一个倍数),这是一个值得商榷的问题。

        2
  •  1
  •   Sparr    16 年前

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

        3
  •  0
  •   Roger Pate Roger Pate    16 年前

    例如,如果提供了[5,8,10],默认值为8,则它将根据偏好继续为[5,8,10,18,26,34,…]或[5,8,10,16,24,32,…]。

    请注意,我将这些数字用作 制表位 宽度 3.