Измените detab, чтобы принять список табуляций
Это моя версия detab из этого упражнения K&R:
Измените detab, чтобы принимать список табуляций в качестве аргументов. Используйте настройку вкладки по умолчанию, если нет аргументов.
#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;
}
Мой вопрос: есть ли более одного аргумента - например, 5, 8, 10 - когда следующая остановка табуляции должна начать действовать? В какой момент программа должна начать использовать TAB_STOP 8 вместо начальных 5? После новой строки или как мне это сделать?
Я также не совсем уверен, должен ли я поместить все это в основную, или я должен придерживаться отдельной функции?
Редактировать: хорошо, это то, что я пытался.
#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;
}
Я на правильном пути? Может ли это работать? Я до сих пор не изменил detab.
3 ответа
Я бы интерпретировал TABSTOP 5 8 10, чтобы обозначить, что в 5-м, 8-м и 10-м столбцах есть табуляция (и после этого, каждые 8 столбцов или что вы используете по умолчанию. следующая позиция табуляции после столбца 10 должна быть в столбце 18 (через 8 пробелов) или 16 (следующий кратный значению по умолчанию 8).
Список точек табуляции определяет конкретные столбцы, а не расстояния между остановками. То есть, если список 5, 5,10, то на вкладке в позициях 1-4 следует поместить курсор на 5, в позициях 5-7 - на 8, а на 8-9 - на 10. После каждая новая строка списка аргументов должна начинаться снова с первой табуляции снова. Поведение в строке после последней определенной остановки табуляции зависит от вас, обычно вы возвращаетесь к некоторому интервалу остановки табуляции по умолчанию.
У вас есть некоторая свобода действий, когда вы ее разрабатываете; тем не менее, наиболее популярный метод - продолжить с ширины по умолчанию после последней предоставленной ширины.
Например, если указано [5, 8, 10] и по умолчанию установлено значение 8, оно будет продолжаться как [5, 8, 10, 18, 26, 34, ...] или [5, 8, 10, 16, 24, 32, ...], в зависимости от предпочтений.
Обратите внимание, что я использую эти цифры в качестве табуляции вместо ширины. Таким образом, [5, 8] означает, что первая остановка находится на 5 с шириной 5, а вторая на 8 с шириной 3.