Domanda

Questa è la mia versione di detab, da questo esercizio K & R:

  

Modifica detab ad accettare un elenco di tabulazioni come argomenti. Utilizzare l'impostazione scheda predefinita, se non ci sono argomenti.

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

La mia domanda è se ci sono più di un argomento, ad esempio 5, 8, 10, quando è la scheda prossima fermata supponiamo di cominciare ad essere attivo? A quel punto dovrebbe programmare iniziare a utilizzare TAB_STOP 8 al posto del 5 a partire? Dopo un ritorno a capo o come devo fare questo?

Sono anche non proprio sicuro se devo mettere tutto questo in principale, o dovrei attaccare con una funzione separata?

Modifica:. Ok questo è quello che ho cercato

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

Sono sulla strada giusta? Può questo lavoro? Ho ancora havent detab modificato.

È stato utile?

Soluzione

Mi piacerebbe interpretare tabstop 5 8 10 per significare ci sono scheda si ferma al 5 th , 8 th e 10 th Colonne (e dopo che, ogni 8 colonne, o qualsiasi altra cosa che si sta utilizzando come predefinito. e 'una questione aperta se la prossima scheda fermata dopo colonna 10 deve essere di colonna 18 (8 spazi più tardi) o 16 (il prossimo multiplo di default 8).

Altri suggerimenti

Un elenco di tabulazione specifica particolari colonne, non distanze tra fermate. Cioè, se l'elenco è 5,8,10 poi una scheda in posizioni 1-4 dovrebbe posizionare il cursore 5, in posizioni 5-7 dovrebbe posizionare il cursore 8, e 8-9 posto il cursore 10. Dopo ogni fine riga della lista degli argomenti dovrebbe ripartire dalla prima scheda fermarsi di nuovo. Il comportamento su una linea dopo l'ultima tabulazione definita dipende da voi, in genere si dovrebbe tornare ad un certo intervallo scheda predefinita di arresto.

Hai qualche margine di manovra qui, come si sta progettando esso; tuttavia, il metodo più popolare è quello di continuare con la larghezza predefinita dopo l'ultima larghezza in dotazione.

Ad esempio, se [5, 8, 10] e viene fornito il valore predefinito è 8, che continuerà come [5, 8, 10, 18, 26, 34, ...] o [5, 8, 10 , 16, 24, 32, ...], a seconda delle preferenze.

Si noti che sto usando questi numeri come tabulazioni , invece di larghezze . Così [5, 8]: la prima tappa è 5 con larghezza 5, ed il secondo è a 8 con larghezza 3 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top