Измените detab, чтобы принять список табуляций

Это моя версия 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? После новой строки или как мне это сделать?

Я также не совсем уверен, должен ли я поместить все это в основную, или я должен придерживаться отдельной функции?

Редактировать: хорошо, это то, что я пытался.

#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 ответа

Решение

Я бы интерпретировал TABSTOP 5 8 10, чтобы обозначить, что в 5-м, 8-м и 10-м столбцах есть табуляция (и после этого, каждые 8 ​​столбцов или что вы используете по умолчанию. следующая позиция табуляции после столбца 10 должна быть в столбце 18 (через 8 пробелов) или 16 (следующий кратный значению по умолчанию 8).

Список точек табуляции определяет конкретные столбцы, а не расстояния между остановками. То есть, если список 5, 5,10, то на вкладке в позициях 1-4 следует поместить курсор на 5, в позициях 5-7 - на 8, а на 8-9 - на 10. После каждая новая строка списка аргументов должна начинаться снова с первой табуляции снова. Поведение в строке после последней определенной остановки табуляции зависит от вас, обычно вы возвращаетесь к некоторому интервалу остановки табуляции по умолчанию.

У вас есть некоторая свобода действий, когда вы ее разрабатываете; тем не менее, наиболее популярный метод - продолжить с ширины по умолчанию после последней предоставленной ширины.

Например, если указано [5, 8, 10] и по умолчанию установлено значение 8, оно будет продолжаться как [5, 8, 10, 18, 26, 34, ...] или [5, 8, 10, 16, 24, 32, ...], в зависимости от предпочтений.

Обратите внимание, что я использую эти цифры в качестве табуляции вместо ширины. Таким образом, [5, 8] означает, что первая остановка находится на 5 с шириной 5, а вторая на 8 с шириной 3.

Другие вопросы по тегам