Почему в этом примере для сравнения строк используется заполнение нулями? "Программирование жемчуга": нити жемчуга
В разделе "Программирование жемчуга": "Струны жемчуга", раздел 15.3 ("Генерация текста"), автор представляет, как генерировать произвольный текст из входного документа. В исходном коде есть некоторые вещи, которые я не понимаю.
for (i = 0; i < k; i++)
word[nword][i] = 0;
Автор объясняет: "После прочтения ввода мы добавляем k нулевых символов (чтобы функция сравнения не заканчивалась до конца)". Это объяснение действительно смущает меня, так как оно все еще хорошо работает после комментирования этих двух строк. Почему это необходимо?
2 ответа
Это уменьшает количество странных случаев, с которыми вам приходится сталкиваться при проведении посимвольных сравнений.
alphabet
alpha___
Если вы пошагово проходили по одной букве за раз, и в конце alpha
там не было, вы попытались бы изучить следующий элемент... и запустить сразу с конца массива. Нулевое заполнение в основном гарантирует, что когда в одном слове есть символ, в другом есть соответствующий символ. И поскольку нулевой символ имеет значение 0, более короткое слово всегда будет считаться "меньше", чем более длинное!
Что касается того, почему он работает без этих строк, я могу подумать о двух связанных с этим причинах:
- Это было написано на C. C не защищает границы своего массива; вы можете прочитать любые ненужные данные за пределами места, выделенного для них, и вы никогда ничего не услышите.
- Ваш входной документ сделан так, что вы никогда не сравниваете две строки, где одна является префиксом другой (например,
alpha
это кalphabet
).
Как уже объяснялось в другом ответе, цель состоит в том, чтобы завершить строку нулем.
Но я прочитал опубликованную ссылку, и этот цикл не имеет смысла. Если посмотреть на используемую функцию сравнения, то нет причины, по которой вся строка должна быть заполнена нулями в этом случае. Равнина word[nword][0] = 0;
без цикла for работал бы так же хорошо. Или предпочтительно:
word[nword][0] = '\0';
Заполнение всей строки нулями добавит довольно много времени выполнения.