Упражнение 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;
}
Для большей наглядности вместо пробелов использую символ ' | '
Результат:
А почему количество пробелов, которые вы заменяете на табуляцию, каждый раз меняется?
ОтветитьУдалитьВ Википедии сказано, что табуляция это 8 знакомест. Как бы табуляция это константное число знакомест. Или я чего-то не понимаю?
Я задание понял так: если введена табуляция, заменить ее на 8 пробелов. И мне не понятно зачем в задании указывать на каком расстоянии друг от друга стопы табуляции?
Сначала понял и сделал аналогично.
УдалитьНе знал, что с табуляцией не все так просто.
Табуляция это не просто 8 знакомест, а перемещение курсора на позицию Каждые 8 знакомест - 1, 9, 17, 25.
Т.е., если будет один символ, то будет 8 пробелов относительно начала строки, если 7, то 1 пробел.
Более подробно рассказано в википедии.
Представленный код неверный. Например, если ввести текст
ОтветитьУдалить"qweqweq->q", то вместо одного пробела будет 7.
Вставлять код сюда не стану, т.к. исправление показалось мне хорошей зарядкой для ума.