как изменить detab, чтобы он принимал список аргументов
-
19-09-2019 - |
Вопрос
#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;
}
В основном я помещаю все аргументы (числа) в массив nums, а затем передаю их в detab.Итак, теперь мне интересно, какой разумный способ отредактировать detab, чтобы он работал.Я все еще пытаюсь найти работающий псевдокод, но я действительно не знаю.
Я думал, что это должно работать:если аргументы равны 5, 8, 10, то табуляция внутри первых 4 символов ведет к позиции 5, в 5-7-м символе ведет к позиции 8 и т. д.В случае новой строки аргументы начинаются заново с самого начала.
Решение
Самый распространенный способ — заставить Detab принять указатель (который указывает на элемент массива) и длину этого массива:
int Detab(int* data, int len); // access data[0] through data[len - 1]
Назовите это так:
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
}
Вот псевдокод для расширения вкладок:
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, " ")
Попробуйте это на кодовая панель.
Не связан с StackOverflow