Pregunta

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

En principal i poner todos los argumentos (números) dentro nums matriz y luego pasarlo a detab. Así que ahora estoy interesado lo que sería la manera inteligente de editar detab por lo que funciona. Todavía estoy tratando de averiguar por un pseudocódigo de trabajo, pero yo no sé realmente.

La forma en que tought que debería funcionar es: Si los argumentos son 5, 8, 10 y luego una pestaña dentro de los primeros 4 caracteres lleva a la posición 5, en 5 - 7 de carbón conduce a pos 8 etc. En caso de una nueva línea, los argumentos empezar de nuevo desde el principio.

¿Fue útil?

Solución

La forma más común es tener detab acepta un puntero (que apunta a un elemento de una matriz) y la longitud de esa matriz:

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

Lo llaman de esta manera:

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
}

Aquí hay algo de pseudocódigo para la expansión de fichas:

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

Pruébelo en teclado .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top