Подпрограмма длины строки в сборке как замена strlen в C ++ - PullRequest
0 голосов
/ 12 декабря 2011

Я сейчас сталкиваюсь с определенными проблемами со strlen (во многих случаях я читаю файлы, и строка не заканчивается на ноль).Поэтому я подумал о том, чтобы сделать процедуру сборки для расчета длины моих струн.То, что я хотел бы сделать, это просто вернуться назад от конца строки, пока я не столкнусь с моим первым символом, а затем вычислить длину строки.На самом деле у меня уже есть тот, который я написал некоторое время назад, когда писал программы на ассемблере.

Теперь я хотел бы знать, есть ли причина, по которой я не должен этого делать?Какие-то конкретные преимущества, которые я бы потерял?

Другой альтернативой будет просто сделать каждый член моего массива символов равным нулю.Я мог бы сделать это в сборке по 4 байта за раз или даже через простой цикл for.

Имейте в виду, что я имею в виду массивы значительных размеров [64k].Из-за большой длины обработка должна быть очень быстрой, поскольку мне нужно отобразить файл, как только пользователь выберет его.

РЕДАКТИРОВАТЬ: Чтобы уточнить, сказав, что я знаю, что я знаю длинуЯ имею в виду строку:

char* buffer = new char[length];

Я знаю length.Но когда я заполняю этот буфер, я не знаю точную длину, до которой он имеет символы ascii.Когда я использую strlen, это не дает мне текущую длину.В основном length может быть 500, но в нем может быть только 5 допустимых символов, а остальные 495 могут быть значениями мусора.

1 Ответ

4 голосов
/ 12 декабря 2011

Теперь я хотел бы знать, есть ли причина, по которой я не должен этого делать?

Да. Если у вас уже есть конечный байт строки и ее начало, то вы знаете его длину:

const char *begin = //beginning.
const char *end = //last byte of string.
ptrdiff_t stringLength = (end - begin) + 1;

+1 потому что end указывает на последний байт строки. Если бы end был один за концом, вам не понадобилось бы +1. Нет необходимости в какой-либо процедуре для вычисления того, что вы уже знаете.

Обратите внимание, что это предполагает, что строка является ASCII или какой-либо другой однобайтовой кодировкой символов. Если вы используете какую-то кодировку Unicode (UTF-8, UTF-16 и т. Д.), Вам придется сканировать строку, чтобы выяснить, сколько она кодовых точек.

Конечно, если это кодировка Unicode, тогда нужно решить вопрос о том, что именно вы подразумеваете под «длиной». «Длина» может быть «числом кодовых точек», «количеством различных графем» или даже «количеством кодовых единиц в кодировке».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...