como modificar detab a lista de argumentos aceitar
-
19-09-2019 - |
Pergunta
#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;
}
Na página i colocar todos os argumentos (números) no interior variedade nums e, em seguida, passá-lo para detab. Então agora estou interessado que seria a forma inteligente de editar detab por isso funciona. Eu ainda estou tentando descobrir por um pseudocódigo trabalhando, mas eu realmente não sei.
A maneira que eu pensei que deve funcionar é: se argumentos são 5, 8, 10, em seguida, uma aba interior 4 primeiros caracteres leva à posição 5, em 5 - 7a leva CHAR para pos 8 etc. No caso de uma nova linha, os argumentos começar tudo de novo desde o início.
Solução
A maneira mais comum é ter detab aceitar um ponteiro (que aponta para um elemento de uma matriz) e o comprimento da matriz que:
int Detab(int* data, int len); // access data[0] through data[len - 1]
Chamá-lo assim:
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
}
Eis alguns pseudocódigo para a expansão guias:
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, " ")
Experimente em Controlador Remoto .