Можете объяснить данный фрагмент кода? Долго размышлял над задачей 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; ++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 = MAXCOL) {
return 0;
}
else {
i = 0;
for (j = pos; j < MAXCOL; ++j) {
line[i] = line[j];
++i;
}
return i;
}
}
Никак не понимаю, почемуif (pos = MAXCOL) {
return 0;
Во-первых, как pos может быть = MAXCOL, мы возвращаем pos = 0;
Либо я не вижу сейчас элементарного, то ли что...

21 Авг 2019 в 06:24
296 +1
0
Ответы
1

Данный фрагмент кода предполагает обработку случаев, когда значение переменной pos выходит за пределы допустимого диапазона.

В первом условии if (pos <= 0 || pos >= MAXCOL), проверяется, что значение pos не меньше нуля и не больше или равно MAXCOL (значение константы MAXCOL равно 10 в данном случае).

Если pos <= 0, это может возникнуть при первом вызове функции newpos, когда pos было равно 0 (так как индексы начинаются с 0), и новая позиция также должна быть равна 0 (возвращается 0).

Если pos >= MAXCOL, это означает, что после переноса символов строки, новая позиция i для записи символов обновленной строки будет превышать значение MAXCOL, что не допустимо. Поэтому в данном случае также возвращается 0, чтобы начать запись символов с начала строки.

Таким образом, в обоих случаях возвращается 0, что означает начало строки для записи новых символов после переноса.

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир