Это моя версия 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 на правильном пути? Может ли это работать? Я до сих пор не модифицирован.
Как именно я должен это реализовать. Должен ли я разместить весь этот код в главном, а затем сначала обработать все, что есть в argc/argv, а затем продолжить с нормальным detab? – Tool
Возможно, я подумал о том, чтобы хранить числа в одном массиве в основном, а затем передать этот массив в Detab(), который затем меняет аргумент TAB_STOP, пока не достигнет \ 0. Просто идея. – Tool
Возможно, вы захотите поставить свой второй вопрос на второй вопрос. :) «Как передать переменное количество параметров в функцию?» «Как мне изменить Detab, чтобы сделать X?» были бы возможны названия *, но также и области, которые вы должны искать * по ранее задаваемым вопросам (особенно первый). – 2010-01-07 23:25:09