Я недавно решил изучать C, поэтому я начал изучать K & R, но я застрял в проблеме 21 в главе 1. Предполагается, что вы пишете программу, которая дает строку без вкладок и определенной ширины табуляции, преобразует все белоепробел в эквивалентном интервале, используя табуляцию и пробел.
Пока у меня есть это:
void entab (char from[], char to[], int length, int tabwidth)
{
int i, j, tabpos, flag, count;
j = tabpos = flag = count = 0;
for (i = 0; from[i] != '\0' && j < length - count - 2; i++) {
if (from[i] == ' ') {
// If you see a space, set flag to true and increment the
// whitespace counter. Don't add any characters until you reach the
// next tabstop.
count++;
tabpos = (tabpos + 1) % tabwidth;
flag = 1;
if (count >= tabwidth - tabpos) {
to[j] = '\t';
j++;
count = count - tabwidth + tabpos;
tabpos = 0;
}
} else {
if (flag == 1) {
// if you see something other than a space and flag is true,
// there weren't enough spaces to reach a tabstop. Add count
// spaces to the string.
flag = 0;
tabpos = (tabpos + count + 1) % tabwidth;
while (count > 0) {
to[j] = ' ';
j++;
count--;
}
} else {
tabpos = (tabpos + 1) % tabwidth;
}
count = 0;
to[j] = from[i];
j++;
}
}
to[j] = '\0';
return;
}
, что, к сожалению, кажется, дает немного больший интервал, чем предполагалось,Любые идеи о том, где я облажался?
PS Я смотрел на другие решения онлайн, и я понимаю, что есть гораздо лучший подход к проблеме, но я действительно хотел бы исправить ошибку в моей.
РЕДАКТИРОВАТЬ: Задав ширину табуляции = 4 и используя:
foobar
foo bar foo bar
foo bar
в качестве ввода, я получаю:
/t/tfoobar
/t/t/t/tfoo bar/t/t/t foo bar
/t/tfoo/t/t bar
в качестве вывода, тогда как правильный вывод будет:
/tfoobar
/t/tfoo/t bar/t/t foo bar
/tfoo/t/tbar