Я делаю некоторые упражнения из "языка программирования C" и не могу понять, что происходит, чтобы дать мне определенный результат. На самом деле это не препятствие, потому что я получил желаемый результат, но я не понимаю, почему изменение определенного фрагмента моего кода на самом деле дало мне нужный вывод. Просто искал объяснение.
Вот код, который работает так, как я хочу. Часть, которую я не понимаю, это s[++i] = ' ';
в цикле 'k' for. До того, как я использовал s[++i]
, я использовал:
s[i] = ' ';
++i;
, который бы помещал только 1 пробел в массиве, независимо от того, сколько разпетля k побежал.
Затем, просто для тестирования, я поставил ++i;
над s[i] = ' ';
, и в выводе не было ни одного пробела.
#include <stdio.h>
#define MAXLINE 1000
#define TABSTOP 5
/* Write a program "detab" that replaces tabs in the input with a proper
number of blanks to space to the next tab stop. Assume a fixed set of tab
stops, say every n columnns. Should n be a variable or a synbolic parameter? */
int main() {
char c;
int i, j;
int modTabStop, numTabs, k;
char s[MAXLINE];
i = 0;
while((c = getchar()) != EOF) {
if(c == '\t') {
modTabStop = i % TABSTOP;
numTabs = TABSTOP - modTabStop;
for(k = 0;k <= numTabs; ++k)
s[++i] = ' ';
}
else if(c == '\n') {
;
}
else {
s[i] = c;
++i;
}
}
for(j = 0;j <= i;++j)
printf("%c", s[j]);
return 0;
}
Мне просто интересно, почему s[++i]
работал, и никто из других не сделал. Мой ожидаемый результат определен в комментарии над основной функцией. Но только для пояснения, я использовал тестовую строку «собака (табуляция)». Когда он работает правильно, вместо вкладки между «the» и «dog» должны быть помещены только 2 пробела, потому что моя точка табуляции равна 5, а «the» имеет длину в три буквы («the (space) (space) dog»)). Если я поставлю ++i;
после s[i] = ' '
, то получу один пробел между ("(пробел) собака"). И если я помещу это прежде, я не получаю пробелы ("thedog").
Я просто хочу убедиться, что я все это понимаю, прежде чем двигаться дальше. Спасибо, ребята!