Страницы

Translate

суббота, 20 июля 2013 г.

Упражнение 1.20. Напишите программу detab, заменяющую символы табуляции во вводимом тексте нужным числом пробелов

Упражнение 1.20. Напишите программу detab, заменяющую символы табуляции во вводимом тексте нужным числом пробелов (до следующего "стопа" табуляции). Предполагается, что "стопы" табуляции расставлены на фиксированном расстоянии друг от друга, скажем, через n позиций. Как лучше задавать n — в виде значения переменной или в виде именованной константы?

n лучше задать в виде именованной константы.

/*detab*/

#include <stdio.h>
#define TAB 8

int main()
{
int c, i, symvol, ntab;
    
symvol=1;//количество введённых символов до табуляци
while((c=getchar()) != EOF)
{
if(c=='\t')
{
//определяем количество пробелов
//нужных для вставки
ntab = TAB - (symvol-1);
for(i=0; i<ntab; i++)
putchar('|');//тут должен стоять пробел
symvol=0;
}
else if(c=='\n')
{
symvol=0;
printf("\n");
}
else
putchar(c);
symvol++;
            if(symvol==TAB)
                symvol=0;
}
return 0;
}

Для большей наглядности вместо пробелов использую символ ' | '
Результат:  


3 комментария:

  1. А почему количество пробелов, которые вы заменяете на табуляцию, каждый раз меняется?

    В Википедии сказано, что табуляция это 8 знакомест. Как бы табуляция это константное число знакомест. Или я чего-то не понимаю?

    Я задание понял так: если введена табуляция, заменить ее на 8 пробелов. И мне не понятно зачем в задании указывать на каком расстоянии друг от друга стопы табуляции?

    ОтветитьУдалить
    Ответы
    1. Сначала понял и сделал аналогично.
      Не знал, что с табуляцией не все так просто.
      Табуляция это не просто 8 знакомест, а перемещение курсора на позицию Каждые 8 знакомест - 1, 9, 17, 25.
      Т.е., если будет один символ, то будет 8 пробелов относительно начала строки, если 7, то 1 пробел.
      Более подробно рассказано в википедии.

      Удалить
  2. Представленный код неверный. Например, если ввести текст
    "qweqweq->q", то вместо одного пробела будет 7.
    Вставлять код сюда не стану, т.к. исправление показалось мне хорошей зарядкой для ума.

    ОтветитьУдалить