@IndusDev

Можете объяснить данный фрагмент кода?

Долго размышлял над задачей 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;
Либо я не вижу сейчас элементарного, то ли что...
  • Вопрос задан
  • 817 просмотров
Решения вопроса 2
terrier
@terrier
Во-первых, как pos может быть <= 0, это же невозможно.

Ошибка в определении типа параметров функции привела к вот таким странностям. Довольно очевидно, что pos, позиция символа в строке - это беззнаковая переменная и проверка на "меньше нуля" излишняя (и вот в остальные функции ее разумно вставлять не стали). Все вот эти
int findspace(int pos);
int newpos(int pos);
int exptab(int pos);
должны принимать и возвращать беззнаковое, но видимо про эти типы Тондо и Гимпел еще не дочитали.
Ответ написан
Stalker_RED
@Stalker_RED
pos может равняться нулю, то есть условие будет исполнятся. Почему там <= - затрудняюсь ответить. Может опечатка, может перестраховка.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы