Domanda

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

In main metto tutti gli argomenti (numeri) all'interno nums matrice e poi passare a detab. Così ora Sono interessato quale sarebbe il modo intelligente per modificare detab così funziona. Sto ancora cercando di capire per un pseudocodice di lavoro, ma io non so davvero.

Il modo in cui ho insegnato dovrebbe funzionare è: se argomenti sono 5, 8, 10 quindi una linguetta all'interno primi 4 caratteri porta in posizione 5, in 5 - 7 char porta alla pos 8 etc. In caso di un ritorno a capo, gli argomenti ricominciare tutto da capo fin dall'inizio.

È stato utile?

Soluzione

Il modo più comune è quello di avere detab accettare un puntatore (che indica un elemento in un array) e la lunghezza di tale matrice:

int Detab(int* data, int len); // access data[0] through data[len - 1]

Lo chiamano in questo modo:

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
}

Ecco alcuni pseudocodice per le schede espansione:

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, " ")

Provalo in tastiera codici .

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