Если твой вопрос "Что это просит меня сделать?" Я думаю, что могу помочь, перефразируя исходный вопрос (излагая тот же вопрос другим способом).
Напишите программу, которая принимает в качестве входного текста пробелы и выдает в качестве выходного визуально эквивалентный текст с использованием вкладок в максимально возможной степени.
Например, с табуляции каждые 8 символов и пробелами в виде '.' и вкладки как '-';
input;
".foo:...bar;......#comment"
output;
".foo:-bar;-..#comment"
input;
".......-foo:.....bar;......#comment"
output;
"-foo:-.bar;-...#comment"
Напишите программу, чтобы можно было варьировать параметр табуляции n, т. Е. Разрешить значения n, отличные от 8. Будьте готовы обосновать свое решение сделать n постоянной или альтернативной переменной.
Редактировать Я посмотрел на ваш код и думаю, что он более сложный, чем должен быть. Мой совет - делать это персонажем одновременно. Там нет необходимости буферизовать целую строку. Сохраняйте количество столбцов при чтении каждого символа («\ n» сбрасывает его в ноль, «\ t» увеличивает его на 1 или более, другие символы увеличивают его). Когда вы видите пробел (или табуляцию), не запускайте ничего сразу, начните процесс включения, выбрасывайте ноль или более табуляций, а затем пробелы позже (в '\ n' или в непропуске, в зависимости от того, что произойдет раньше).
Последний совет: конечный автомат может значительно облегчить написание, проверку, тестирование и чтение такого рода алгоритмов.
Редактировать 2 В бесстыдной попытке заставить ОП принять мой ответ, я теперь пошел вперед и фактически сам кодировал решение, основываясь на подсказках, которые я предлагал выше, и моих комментариях в обсуждении.
// K&R Exercise 1-21, entab program, for Stackoverflow.com
#include <stdio.h>
#define N 4 // Tabstop value. Todo, make this a variable, allow
// user to modify it using command line
int main()
{
int col=0, base_col=0, entab=0;
// Loop replacing spaces with tabs to the maximum extent
int c=getchar();
while( c != EOF )
{
// Normal state
if( !entab )
{
// If whitespace goto entab state
if( c==' ' || c=='\t' )
{
entab = 1;
base_col = col;
}
// Else emit character
else
putchar(c);
}
// Entab state
else
{
// Trim trailing whitespace
if( c == '\n' )
{
entab = 0;
putchar( '\n' );
}
// If not whitespace, exit entab state
else if( c!=' ' && c!='\t' )
{
entab = 0;
// Emit tabs to get close to current column position
// eg base_col=1, N=4, col=10
// base_col + 3 = 4 (1st time thru loop)
// base_col + 4 = 8 (2nd time thru loop)
while( (base_col + (N-base_col%N)) <= col )
{
base_col += (N-base_col%N);
putchar( '\t' );
}
// Emit spaces to close onto current column position
// eg base_col=1, N=4, col=10
// base_col -> 8, and two tabs emitted above
// base_col + 1 = 9 (1st time thru this loop)
// base_col + 1 = 10 (2nd time thru this loop)
while( (base_col + 1) <= col )
{
base_col++;
putchar( ' ' );
}
// Emit buffered character after tabs and spaces
putchar( c );
}
}
// Update current column position for either state
if( c == '\t' )
col += (N - col%N); // eg col=1, N=4, col+=3
else if( c == '\n' )
col=0;
else
col++;
// End loop
c = getchar();
}
return 0;
}