Почему в этом примере для сравнения строк используется заполнение нулями? "Программирование жемчуга": нити жемчуга

В разделе "Программирование жемчуга": "Струны жемчуга", раздел 15.3 ("Генерация текста"), автор представляет, как генерировать произвольный текст из входного документа. В исходном коде есть некоторые вещи, которые я не понимаю.

for (i = 0; i < k; i++)
        word[nword][i] = 0;

Автор объясняет: "После прочтения ввода мы добавляем k нулевых символов (чтобы функция сравнения не заканчивалась до конца)". Это объяснение действительно смущает меня, так как оно все еще хорошо работает после комментирования этих двух строк. Почему это необходимо?

2 ответа

Решение

Это уменьшает количество странных случаев, с которыми вам приходится сталкиваться при проведении посимвольных сравнений.

 alphabet
 alpha___

Если вы пошагово проходили по одной букве за раз, и в конце alpha там не было, вы попытались бы изучить следующий элемент... и запустить сразу с конца массива. Нулевое заполнение в основном гарантирует, что когда в одном слове есть символ, в другом есть соответствующий символ. И поскольку нулевой символ имеет значение 0, более короткое слово всегда будет считаться "меньше", чем более длинное!

Что касается того, почему он работает без этих строк, я могу подумать о двух связанных с этим причинах:

  1. Это было написано на C. C не защищает границы своего массива; вы можете прочитать любые ненужные данные за пределами места, выделенного для них, и вы никогда ничего не услышите.
  2. Ваш входной документ сделан так, что вы никогда не сравниваете две строки, где одна является префиксом другой (например, alpha это к alphabet).

Как уже объяснялось в другом ответе, цель состоит в том, чтобы завершить строку нулем.

Но я прочитал опубликованную ссылку, и этот цикл не имеет смысла. Если посмотреть на используемую функцию сравнения, то нет причины, по которой вся строка должна быть заполнена нулями в этом случае. Равнина word[nword][0] = 0; без цикла for работал бы так же хорошо. Или предпочтительно:

word[nword][0] = '\0';

Заполнение всей строки нулями добавит довольно много времени выполнения.

Другие вопросы по тегам