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

如何修改detab以接受参数列表

  •  -2
  • Tool  · 技术社区  · 16 年前
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.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;
    }
    
    #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];
               }
    
               if(x > MAX_ARGUMENTS - 1) 
                  return 0;
    
               nums[x++] = val;
               nums[x] = '\0';
               val = 0;
         }
    
         while(Detab(nums));
    
         printf("Press any key to continue.\n");
         getchar();
         return 0;
    }
    

    大体上,我将所有参数(数字)放入nums数组中,然后将其传递给detab。所以现在我对编辑detab的聪明方法很感兴趣。我仍在试图找出一个可行的伪代码,但我真的不知道。

    如果参数为5、8、10,则前4个字符内的制表符指向位置5,第5-7个字符内的制表符指向位置8,以此类推。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Roger Pate Roger Pate    16 年前

    最常见的方法是让Detab接受指针(指向数组中的元素)和该数组的长度:

    int Detab(int* data, int len); // access data[0] through data[len - 1]
    

    这样说吧:

    void example() {
      int array[] = {5, 8, 10};
      Detab(array, 3);
      // or:
      Detab(array, sizeof array / sizeof *array); // second parameter evaluates to 3
                                                  // without using a magic constant
    }
    

    下面是一些用于展开选项卡的伪代码:

    def expandtabs_in_line(line, tabstops, default, space):
      result = ""
      for c in line:
        if c != "\t":
          result += c
        else:
          for stop in tabstops:
            if stop > len(result):
              result += space * (stop - len(result))
              break
          else:
            result += space * (default - (len(result) % default))
      return result
    
    def expandtabs(lines, tabstops=[], default=8):
      for line in lines:
        yield expandtabs_in_line(line, tabstops, default, " ")
    

    codepad .