2010-01-07 4 views
1

Это моя версия detab, от этого K & R упражнения:Изменить detab принять список табуляции

Изменить 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? После новой строки или как мне это сделать?

Я также не совсем уверен, должен ли я поместить все это в основную часть, или я должен придерживаться отдельной функции?

Редактировать: ok, это то, что я пробовал.

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

Am i на правильном пути? Может ли это работать? Я до сих пор не модифицирован.

+0

Как именно я должен это реализовать. Должен ли я разместить весь этот код в главном, а затем сначала обработать все, что есть в argc/argv, а затем продолжить с нормальным detab? – Tool

+0

Возможно, я подумал о том, чтобы хранить числа в одном массиве в основном, а затем передать этот массив в Detab(), который затем меняет аргумент TAB_STOP, пока не достигнет \ 0. Просто идея. – Tool

+0

Возможно, вы захотите поставить свой второй вопрос на второй вопрос. :) «Как передать переменное количество параметров в функцию?» «Как мне изменить Detab, чтобы сделать X?» были бы возможны названия *, но также и области, которые вы должны искать * по ранее задаваемым вопросам (особенно первый). – 2010-01-07 23:25:09

ответ

0

Я бы интерпретировать TabStop 5-10 означает, есть вкладка останавливается на 5-е , 8 я, и 10-й колонны (и после этого, через каждые 8 ​​колонок, или все, что вы используя по умолчанию. Можно поставить вопрос о том, должна ли следующая табуляция останавливаться после столбца 10 в столбце 18 (8 пробелов позже) или 16 (следующий кратный по умолчанию 8).

1

Список остановок табуляции указывает конкретные столбцы, а не расстояния между остановками. То есть, если список равен 5,8,10, то вкладка в позициях 1-4 должна помещать курсор в 5, в положениях 5-7 следует поместить курсор на 8 и 8-9 поместите курсор в 10. После каждой новой строки список аргументов должен начинаться с первой вкладки. Поведение на линии после последней определенной остановки табуляции зависит от вас, как правило, вы вернетесь к некоторому интервалу остановки закладки по умолчанию.

+0

И когда я вхожу в новую строку, то аргументы идут снова и снова? Я имею в виду, если аргументы 5, 8, 10, то сделайте tabstops, как и сказал. и если на 25-м символе появляется новая строка, то все сначала (5, 8, 10)? – Tool

+0

Да, ответ отредактирован. – Sparr

0

У вас есть свобода действий здесь, как вы ее проектируете; однако самым популярным методом является продолжение ширины по умолчанию после последней заданной ширины.

Например, если имеется [5, 8, 10], а по умолчанию 8, оно будет продолжаться как [5, 8, 10, 18, 26, 34, ...] или [5, 8, 10, 16, 24, 32, ...], в зависимости от предпочтения.

Обратите внимание, что я использую эти цифры в качестве табуляции вместо ширины. Таким образом, [5, 8] означает, что первая остановка равна 5 с шириной 5, а вторая равна 8 с шириной .

Смежные вопросы