Измените detab, чтобы принять список табуляций - PullRequest
1 голос
/ 08 января 2010

Это моя версия 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 ]

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

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

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

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

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

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

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

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

...