Долго размышлял над задачей 1.22 из книги K&R.
В итоге решил посмотреть решение из книги решений их задач (Тондо и Гимпел).
Задача такая:
Напишите программу, печатающую символы входного потока так, чтобы строки текста не выходили правее n-й позиции. Это значит, что каждая строка, длина которой превышает n, должна печататься с переносом на следующие строки. Место переноса следует “искать” после последнего символа, отличного от символа-разделителя, расположенного левее n-й позиции. Позаботьтесь о том, чтобы ваша программа вела себя разумно в случае очень длинных строк, а также когда до n-й позиции не встречается ни одного символа пробела или табуляции.
Увидел там такое решение:
#include <stdio.h>
#define TABINC 8
#define MAXCOL 10
char line[MAXCOL];
void println(int pos);
int findspace(int pos);
int newpos(int pos);
int exptab(int pos);
int main() {
int c, pos;
pos = 0;
while ((c = getchar()) != EOF) {
line[pos] = c;
if (c == '\t') {
pos = exptab(pos);
}
else if (c == '\n') {
println(pos);
pos = 0;
}
else if (++pos >= MAXCOL) {
pos = findspace(pos);
println(pos);
pos = newpos(pos);
}
}
system("pause");
return 0;
}
int findspace(int pos) {
while (pos > 0 && line[pos] != ' ') {
--pos;
}
if (pos == 0)
return MAXCOL;
else
return pos + 1;
}
void println(int pos) {
int i;
for (i = 0; i < pos; ++i) {
putchar(line[i]);
}
if (pos > 0)
putchar('\n');
}
int newpos(int pos) {
int i, j;
if (pos <= 0 || pos >= MAXCOL) {
return 0;
}
else {
i = 0;
for (j = pos; j < MAXCOL; ++j) {
line[i] = line[j];
++i;
}
return i;
}
}
int exptab(int pos) {
line[pos] = ' ';
for (++pos; pos < MAXCOL && pos % TABINC != 0; ++pos) {
line[pos] = ' ';
}
if (pos < MAXCOL)
return pos;
else {
println(pos);
return 0;
}
}
Интересует данный фрагмент кода:
int newpos(int pos) {
int i, j;
if (pos <= 0 || pos >= MAXCOL) {
return 0;
}
else {
i = 0;
for (j = pos; j < MAXCOL; ++j) {
line[i] = line[j];
++i;
}
return i;
}
}
Никак не понимаю, почему
if (pos <= 0 || pos >= MAXCOL) {
return 0;
Во-первых, как pos может быть <= 0, это же невозможно.
И во-вторых, почему если pos >= MAXCOL, мы возвращаем pos = 0;
Либо я не вижу сейчас элементарного, то ли что...