Pergunta

Esta é a minha versão do detab, a partir deste exercício K & R:

Modificar detab para aceitar uma lista de paradas de tabulação como argumentos. Use a configuração de tabulação padrão, se não há argumentos.

#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;
}

A minha pergunta é se há mais de um argumento, por exemplo 5, 8, 10, quando é a próxima parada de tabulação supor para começar a ser ativo? Em que ponto deve programar começar a usar TAB_STOP 8 em vez da partir de 5 de? Depois de uma nova linha ou como devo fazer isso?

Eu também não tenho certeza se eu deveria colocar tudo isso em principal, ou devo ficar com uma função separada?

Edit:. Ok isso é o que eu tentei

#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;
}

Am i no caminho certo? Pode este trabalho? Eu ainda não reembolsaram detab modificado.

Foi útil?

Solução

Eu interpretar TABSTOP 5 8 10 para dizer que há paradas de tabulação nos 5 th , 8 th e 10 th colunas (e depois disso, a cada 8 colunas, ou o que quer que você está usando como padrão. é aberto a questão de saber se a próxima parada de tabulação após coluna 10 deve ser na coluna 18 (8 espaços mais tarde) ou 16 (o próximo múltiplo do padrão 8).

Outras dicas

A lista de tabulações especifica colunas específicas, não distâncias entre paragens. Ou seja, se a lista é 5,8,10 seguida, um guia em posições 1-4 deve colocar o cursor em 5, em posições 5-7 deve colocar o cursor em 8, e 8-9 Coloque o cursor no 10. Depois cada nova linha da lista de argumentos deve começar a partir da primeira parada de tabulação novamente. O comportamento em uma linha após a última parada de tabulação definida é com você, normalmente você iria voltar para algum intervalo guia padrão parar.

Você tem alguma margem de manobra aqui, como você está projetando-lo; no entanto, o método mais popular é a de continuar com a largura padrão após a última largura fornecido.

Por exemplo, se [5, 8, 10] é fornecido eo padrão é 8, que vai continuar como [5, 8, 10, 18, 26, 34, ...] ou [5, 8, 10 , 16, 24, 32, ...], dependendo da preferência.

Note que estou usando esses números como tabulações , em vez de larguras . Assim [5, 8] significa que o primeiro é parada a 5 com uma largura de 5, e o segundo é a 8 com largura 3 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top