Можете объяснить данный фрагмент кода? Долго размышлял над задачей 1.22 из книги K&R. В итоге решил посмотреть решение из книги решений их задач (Тондо и Гимпел). Задача такая: Напишите программу, печатающую символы входного потока так, чтобы строки текста не выходили правее n-й позиции. Это значит, что каждая строка, длина которой превышает n, должна печататься с переносом на следующие строки. Место переноса следует “искать” после последнего символа, отличного от символа-разделителя, расположенного левее n-й позиции. Позаботьтесь о том, чтобы ваша программа вела себя разумно в случае очень длинных строк, а также когда до n-й позиции не встречается ни одного символа пробела или табуляции. Увидел там такое решение:#include #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 0) putchar('\n'); } int newpos(int pos) { int i, j; if (pos = MAXCOL) { return 0; } else { i = 0; for (j = pos; j = MAXCOL) { return 0; } else { i = 0; for (j = pos; j = MAXCOL) { return 0; Во-первых, как pos может быть = MAXCOL, мы возвращаем pos = 0; Либо я не вижу сейчас элементарного, то ли что...
Данный фрагмент кода предполагает обработку случаев, когда значение переменной pos выходит за пределы допустимого диапазона.
В первом условии if (pos <= 0 || pos >= MAXCOL), проверяется, что значение pos не меньше нуля и не больше или равно MAXCOL (значение константы MAXCOL равно 10 в данном случае).
Если pos <= 0, это может возникнуть при первом вызове функции newpos, когда pos было равно 0 (так как индексы начинаются с 0), и новая позиция также должна быть равна 0 (возвращается 0).
Если pos >= MAXCOL, это означает, что после переноса символов строки, новая позиция i для записи символов обновленной строки будет превышать значение MAXCOL, что не допустимо. Поэтому в данном случае также возвращается 0, чтобы начать запись символов с начала строки.
Таким образом, в обоих случаях возвращается 0, что означает начало строки для записи новых символов после переноса.
Данный фрагмент кода предполагает обработку случаев, когда значение переменной pos выходит за пределы допустимого диапазона.
В первом условии if (pos <= 0 || pos >= MAXCOL), проверяется, что значение pos не меньше нуля и не больше или равно MAXCOL (значение константы MAXCOL равно 10 в данном случае).
Если pos <= 0, это может возникнуть при первом вызове функции newpos, когда pos было равно 0 (так как индексы начинаются с 0), и новая позиция также должна быть равна 0 (возвращается 0).
Если pos >= MAXCOL, это означает, что после переноса символов строки, новая позиция i для записи символов обновленной строки будет превышать значение MAXCOL, что не допустимо. Поэтому в данном случае также возвращается 0, чтобы начать запись символов с начала строки.
Таким образом, в обоих случаях возвращается 0, что означает начало строки для записи новых символов после переноса.