0 / 0 / 0
Регистрация: 09.03.2020
Сообщений: 25
|
|
1 | |
Найти длину строки, без использования функции strlen()02.04.2020, 13:50. Показов 15561. Ответов 115
Метки нет (Все метки)
Написать функцию, которая получает строку и возвращает длину строки. Без использования функции strlen ()
0
|
02.04.2020, 13:50 | |
Ответы с готовыми решениями:
115
Узнать длину строки не щитая функции strlen Написать программу, которая определяет длину строки - strlen (число символов без завершающего нуль-символа) Функция strlen возвращает неверную длину строки Подскажите функцию, которая возвращает длину строки (string), strlen не подходит. |
03.04.2020, 20:00 | 81 |
TheCalligrapher, IGPIGP, смекетил. Сие код символа?
Почитал пару статей в интернете об итераторах. Получается, что итератор, это не указатель, а некая абстракция, позволяющая получить доступ к любому элемента контейнера, в свою очередь, хранящего любые данные одного типа. Добавлено через 6 минут И, как я понял, в разименованном виде представляет доступ к первому элементу массива, т.е. в данном случае, к коду символа строки. Соответственно, .end() в разименованном виде хранит ноль.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
03.04.2020, 20:03 | 82 |
слово "любому" - лишнее.
словосочетание "одного типа" - лишнее. слово "к первому" - лишнее. Добавлено через 48 секунд разыменовывание end-iterator`a - UB
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
03.04.2020, 20:08 | 84 |
Если бы разрешалось разыменовывать
end() - то да, вы бы там увидели ноль. Но формально end() разыменовывать не разрешается.И существование этого нуля там под end() - особенность именно std::string . В других контейнерах end() указывает на "пустоту". Никакого нуля там ожидать не приходится.
1
|
Комп_Оратор)
|
|
03.04.2020, 20:09 | 85 |
Не надо его разыменовывать. Отделите терминатора от контейнеров. Он же амбал и всё там поломает) Перечитайте. Абстракция хвостового терминатора полезна в смысле поддержки оператора сравнения на равенство (в общем случае). Но это просто метка. Он не указывает на физический объект в обычной реализации. И ещё его можно приравнять. end() к iterator a cend() к const_iterator. Как итераторы поодерживыают константность в отличие от указателей это отдельная песня) Argus19, тема может охватить весь С++)
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
03.04.2020, 20:16 | 86 |
надо понимать, что это зависит от самого контейнера.
формально - не запрещается.
0
|
Комп_Оратор)
|
|
03.04.2020, 20:36 | 88 |
Argus19,
итератора. Пардон)
Argus19, си-строка это контекст нашего отношения к конкретному инстансу (экземпляру) указателя на char. Мы должны заранее знать о том, что это строка и следовательно в ней записан терминатор. Но физически это же блок памяти содержащий массив символов. Наличие терминатора позволяет этому массиву "знать" свой размер в отличие от массива где присутствие такого символа не гарантировано. Это и делает с-строку эдаким недо-контейнером. Но не за счёт наличия контекста объекта развитого типа (класса или структуры), а путём метаописателя введённого в последовательность данных. И на уровне типа мы не видим разницы между указателем на блок памяти, и указателем на строку. Это наше знание о конкретном указателе char. Если говорить о указателях, вообще, то мы даже не знаем на один элемент или на блок из нескольких элементов он указывает, если это неизвестно заранее. Но это другая песня. Когда-нибудь (может быть) вы узнаете что классы можно укладывать в строки и это делается в том или ином формате какого либо метаязыка. Как тут уже было замечено, - на основе соглашения. А В каком-то смысле строки это верх обобщения. Именно они и не горят, как говорил один из главных героев (о которых всуе не говорят) популярного романа известного писателя.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,066
|
|
03.04.2020, 20:40 | 89 |
Совершенно не верно.
Ноль в конце std::string доступен только через два механизма: operator [] и c_str()/data() . При этом operator [] возвращает ссылку, то есть lvalue. Таким образом даже на абстрактно-формальном уровне этот ноль - обязательно именно физический объект, без вариантов. Ну а это уже совсем какая-то чушь. Все "обычные реализации" с самого начала времен просто хранили внутри std::string обычную сишную нуль-терминированную строку. Даже тогда, когда этому не было предпосылок. И тот ноль, который вы видели в этих std::string - это был тот самый ноль в конце этой сишной строки. Т.е. конкретный физический объект.
0
|
03.04.2020, 20:40 | 90 | |||||
Сложновато. Но со временем, станет проще.
Как я понимаю, ТС нас бросил. Вот последний вариант кода с разными вариантами подсчёта длины строки без использования strlen():
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,066
|
||||||
03.04.2020, 20:45 | 91 | |||||
Непонятно, почему во всех остальных вариантах вы используете "сокращенную" форму записи, а здесь вдруг сидит явное сравнение с нулем. Тогда уже просто
Хотя я бы посоветовал наоборот - везде писать сравнения явно, кроме выраженно булевских значений.
0
|
Комп_Оратор)
|
|
03.04.2020, 20:55 | 92 |
Я опечатался написав терминатор но потом извинился:
хотя в контексте (оператор сравнения на равенство и пр.) здоровому человек ясно что это не о символе '\0'. И подробнее. TheCalligrapher, не желание читать и категоричность делает диалог с вами удовольствием ниже среднего. Вот смотрите. 1. Вы цитируете Приходится тратить кучу времени на поиск огрызка вырванного из контекста. 2. Фраза в полном виде: Она о итераторе на хвост - end() в контенерах (контейнерах, - вообще, не только о строках) И она не о нуле терминаторе. В корне, - как вы говорите. и вердикт узнаваем до боли. А фраза целиком: о итераторе контейнера вообще. И говорится в ней о том, что обычные реализации контейнеров не предоставляют объекта под итератор end(). И зто не чушь. Вы сами говорите: Я сыт по горло нашим с вами диалогом. Устал и пойду пожалуй. В этой теме я кое что сделал, но ей опять кирдык.
0
|
03.04.2020, 21:43 | 93 |
возня в течение нескольких дней. Не до "причёсывания". Надеюсь, ТС удивит преподавателя вариантами способов.
Достаточно много. Если бы книги так писали. Я поставил VS2010, т.к. нашёл книгу А.Хортона именно по ней. Начал читать и быстро "скис". В ветке о VB есть "важное", в которой размещены статьи и ссылки на записи в блоге. Может вам сделать запись в блоге и разместить на неё ссылку в "важном"?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
03.04.2020, 21:52 | 94 |
Argus19, вся хорошая литература есть здесь: Литература C++
Что-то лучше, чем там уже представлено, найти крайне сложно.
1
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
03.04.2020, 22:01 | 96 |
Вопрос должен базироваться на знании Для этого нужны книги.
Если человек пишет "объясните мне - я ничего не знаю", то ему нечего ответить. Репетиторством (особенно бесплатно) тут мало кто готов заниматься.
0
|
IGPIGP
|
03.04.2020, 22:03
#97
|
0
|
03.04.2020, 22:11 | 98 |
Изложение и подход зависит от автора.
Например, мне понадобилось сделать микросайт, чтобы выводить на страничку показания приборов почти в реальном времени. Накачал литературы и убедился, что у всех авторов скачанных книг одна идея: интернет-магазин. Плюнул и пошёл по форумам.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
03.04.2020, 22:25 | 99 |
есть два типа людей:
первые читают книги, учатся, и потом успешно делают микросайты и прочий стафф. вторые плюют, и ходят по форумам.
0
|
03.04.2020, 22:48 | 100 |
Согласен.
В моём варианте оказалось достаточно одной строки HTML, которой не было в книгах. И одной строки VB 6.0, которую дали под большим секретом при условии её неразглашения и, которая впоследствии нашлась в англоязычной части Microsoft, почему-то не переведённой на русский язык. Ни в одной книге по VB этой строки нет, т.к. с прекращением его поддержки, и книг не стало. Как говорится, каждому - своё.
0
|
03.04.2020, 22:48 | |
03.04.2020, 22:48 | |
Помогаю со студенческими работами здесь
100
При попытке вычислить длину строки стандартной функцией strlen возникает ошибка Извлечение подстроки из строки (без использования библиотек функции) Удаление символов из строки без использования стандартной функции delete Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |