как изменить detab для принятия списка аргументов - PullRequest
0 голосов
/ 08 января 2010
#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 Ответ

0 голосов
/ 08 января 2010

Самый распространенный способ - заставить 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, " ")

Попробуйте на кодовой панели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...