Как сделать реверс string c
Как перевернуть строку в C или C++, не требуя отдельного буфера для хранения перевернутой строки?
(Это XOR-swap вещь. Обратите внимание, что вы должны избегать обмена с self, потому что a^a==0.)
Хорошо, давайте исправим символы UTF-8.
Это самый простой способ в C++.
Читайте Керниган и Ричи
Переверните строку на месте (визуализация):
Не злой C, предполагая общий случай, когда строка заканчивается нулем char массив:
Ты используешь std::reverse алгоритм из стандартной библиотеки C++.
Прошло какое-то время, и я не помню, какая книга научила меня этому алгоритму, но я подумал, что он довольно гениален и прост для понимания:
Используйте метод std::reverse из STL:
Обратите внимание, что прелесть std::reverse заключается в том, что он работает с char * струны и std::wstring так же хорошо, как std::string s
Если вы ищете реверсивные буферы с завершением NULL, большинство решений, размещенных здесь, в порядке. Но, как уже указывал Тим Фарли, эти алгоритмы будут работать только в том случае, если допустимо предположить, что строка является семантически массивом байтов (то есть однобайтовых строк), что, как мне кажется, является неверным предположением.
Взять, к примеру, строку "año" (год по-испански).
Кодовые точки Unicode: 0x61, 0xf1, 0x6f.
Рассмотрим некоторые из наиболее часто используемых кодировок:
Latin1 / iso-8859-1 (однобайтовая кодировка, 1 символ равен 1 байту и наоборот):
Оригинал:
0x61, 0xf1, 0x6f, 0x00
Задний ход:
0x6f, 0xf1, 0x61, 0x00
Результат в порядке
UTF-8:
Оригинал:
0x61, 0xc3, 0xb1, 0x6f, 0x00
Задний ход:
0x6f, 0xb1, 0xc3, 0x61, 0x00
Результат - бред и недопустимая последовательность UTF-8
UTF-16 Big Endian:
Оригинал:
0x00, 0x61, 0x00, 0xf1, 0x00, 0x6f, 0x00, 0x00
Первый байт будет рассматриваться как NUL-терминатор. Обратного хода не будет.
UTF-16 Little Endian:
Оригинал:
0x61, 0x00, 0xf1, 0x00, 0x6f, 0x00, 0x00, 0x00
Второй байт будет рассматриваться как NUL-терминатор. Результат будет 0x61, 0x00, строка, содержащая символ "a".
В интересах полноты следует указать, что существуют представления строк на разных платформах, в которых число байтов на символ изменяется в зависимости от символа. Программисты старой школы называли бы это DBCS (двухбайтовый набор символов). Современные программисты чаще сталкиваются с этим в UTF-8 (а также в UTF-16 и других). Есть и другие подобные кодировки.
В любой из этих схем кодирования с переменной шириной простые выложенные здесь алгоритмы ( злые, не злые или иные) не будут работать правильно вообще! Фактически, они могут даже привести к тому, что строка станет неразборчивой или даже недопустимой строкой в этой схеме кодирования. Посмотрите ответ Хуана Пабло Калифано для некоторых хороших примеров.
std:: reverse () потенциально все равно будет работать в этом случае, если реализация Стандартной библиотеки C++ на вашей платформе (в частности, итераторы строк) должным образом учитывает это.
Мой начальный код:
Идея состоит в том, чтобы перевернуть строку с именем myString , которую мы получаем через консольный ввод пользователя.
4 ответа
Если вы пытаетесь перевернуть строку, содержащую только английские буквы (я полагаю, поскольку ваш ответ не содержит методов для обработки других букв), вы можете упростить свой код, выполнив что-то вроде этого:
Этот метод, очевидно, не содержит никакого способа обработки неанглийских букв, это всего лишь упрощение вашего ответа.
Мы можем преобразовать строку в массив символов и обратить массив. Учитывая массив размера N, нам нужно только повторяться в цикле N / 2 раза, одновременно заменяя символы в конце массива на те, что находятся в начале. Мы можем начать с начального и конечного символов, поменять их местами и затем перемещаться внутрь с каждой итерацией, пока не достигнем середины массива.
Преобразовать его в массив символов, обратный, преобразовать в строку. (Вот как бы я сделал это в Java).
Начальный курс программирования для студентов направления "Прикладная математика" Одесского национального университета имени И.И.Мечникова
dr.Mazurok
Software developer AI Scientist Ass.prof Odessa National I.I.Mechnikov University
Личные Ссылки
Проверенные Сервисы
Jane Platonova
- e-olymp 396. Дождь 24/11/2021
- OCPC2021 K: Нобелевская премия 13/11/2021
- OCPC2021 J: Театр теней 13/11/2021
- OCPC2021: I Белка в колесе 13/11/2021
- OCPC2021 H: Счастья всем даром! 13/11/2021
Запишите целое неотрицательное число $n$ в обратном порядке.
Одно целое неотрицательное $64$-х разрядное число.
Выходные данные
Выведите число в обратном порядке.
Тесты
Код программы(String)
Решение задачи(String)
Для решения задачи вводим строку. Узнаем ее длину с помощью функции s . length ( ) , затем циклом выводим строку в обратном порядке. Задача решена.
Код программы(C-string)
Решение задачи(C-string)
Для решения задачи вводим входные данные в массив x [ 64 ] . При вводе считаем какое количество символов заполнилось в массив. Затем от этого числа( length ) начинаем цикл, который выводит массив в обратном порядке. Задача решена.
Ссылки
Опубликованные решения:
- Зарегистрируйтесь на сайте подготовки к собеседованиям или войдите в свой аккаунт. Будет лучше, если Вы сделаете это используя уже имеющийся аккаунт на Facebook. Для этого есть соответствующая кнопка внизу окна регистрации (sign up).
- Перейдите по ссылке в раздел работы со строками. Если перейти не удалось, значит Вы ещё не выполнили предыдущий пункт инструкции.
- Познакомьтесь со всеми материалами и решите все предлагаемые задачи.
Если в качестве домашнего задания на эту тему Вам достались задачи из задачника А.Абрамова А271-А316, то условие задачи следует модифицировать так, чтобы количество вводимых данных было произвольным. Т.е. данные должны читаться до исчерпания потока ввода. Например, вместо 15 элементов в задаче А271 следует читать все данные стандартного потока ввода.
8.1.1 Алгоритм
8.1.1 Алгоритм Сразу после переключения контекста ядро запускает алгоритм планирования выполнения процессов (Рисунок 8.1), выбирая на выполнение процесс с наивысшим приоритетом среди процессов, находящихся в состояниях "резервирования" и "готовности к выполнению, будучи
Расположить в обратном порядке (Reverse)
Расположить в обратном порядке (Reverse) template ‹class BidirectionalIterator›void reverse(BidirectionalIterator first, BidirectionalIterator last);Для каждого неотрицательного целого числа i‹=(last-first)/2 функция reverse применяет перестановку ко всем парам итераторов first+i, (last-i)-1. Выполняется точно (last-first)/2 перестановок.template
Обратные итераторы (Reverse iterators)
Обратные итераторы (Reverse iterators) Двунаправленные итераторы и итераторы произвольного доступа имеют соответствующие адаптеры обратных итераторов, которые выполняют итерации через структуру данных в противоположном направлении.Они имеют те же самые сигнатуры, как и
12.6.4. Операция list::reverse()
12.6.4. Операция list::reverse() void list::reverse();Операция reverse() изменяет порядок следования элементов списка на
Алгоритм max()
Алгоритм max() template class Type const Type&max( const Type &aval, const Type &bval );template class Type, class Compare const Type&max( const Type &aval, const Type &bval, Compare comp );max() возвращает наибольшее из двух значений aval и bval. В первом варианте используется оператор "больше", определенный в классе Type; во втором - операция
Алгоритм min()
Алгоритм min() template class Type const Type&min( const Type &aval, const Type &bval );template class Type, class Compare const Type&min( const Type &aval, const Type &bval, Compare comp );min() возвращает меньшее из двух значений aval и bval. В первом варианте используется оператор “меньше”, определенный для типа Type; во втором - операция
Алгоритм mismatch()
Алгоритм mismatch() template class InputIterator1, class InputIterator2 pairInputIterator1, InputIterator2mismatch( InputIterator1 first,InputIterator1 last, InputIterator2 first2 );template class InputIterator1, class InputIterator2,class BinaryPredicate pairInputIterator1, InputIterator2mismatch( InputIterator1 first, InputIterator1 last,InputIterator2 first2, BinaryPredicate pred );mismatch() сравнивает две последовательности и находит
Алгоритм nth_element()
Алгоритм nth_element() template class RandomAccessIterator voidnth_element( RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last );template class RandomAccessIterator, class Compare voidnth_element( RandomAccessIterator first,RandomAccessIterator nth,RandomAccessIterator last, Compare comp );nth_element() переупорядочивает последовательность, ограниченную диапазоном [first,last), так что все
Алгоритм partial_sort()
Алгоритм partial_sort() template class RandomAccessIterator voidpartial_sort( RandomAccessIterator first,RandomAccessIterator middle,RandomAccessIterator last );templatepartial_sort() сортирует часть последовательности, укладывающуюся в диапазон [first,middle). Элементы в диапазоне [middle,last) остаются неотсортированными. Например, если дан массивint ia[] =
Алгоритм partial_sum()
Алгоритм partial_sum() template class InputIterator, class OutputIterator OutputIteratorpartial_sum(InputIterator first, InputIterator last,OutputIterator result );template class InputIterator, class OutputIterator,class BinaryOperation OutputIteratorpartial_sum(InputIterator first, InputIterator last,OutputIterator result, BinaryOperation op );Первый вариант partial_sum() создает из последовательности, ограниченной
Алгоритм partition()
Алгоритм partition() template class BidirectionalIterator, class UnaryPredicate BidirectionalIteratorpartition(BidirectionalIterator first,BidirectionalIterator last, UnaryPredicate pred );partition() переупорядочивает элементы в диапазоне [first,last). Все элементы, для которых предикат pred равен true, помещаются перед элементами, для которых он равен false.
Алгоритм random_shuffle()
Алгоритм random_shuffle() template class RandomAccessIterator voidrandom_shuffle( RandomAccessIterator first,RandomAccessIterator last );template class RandomAccessIterator,class RandomNumberGenerator voidrandom_shuffle( RandomAccessIterator first,RandomAccessIterator last,RandomNumberGenerator rand);random_shuffle() переставляет элементы из диапазона [first,last) в случайном порядке. Во втором варианте можно
Метод Reverse
Метод Reverse Описание методовМетоды приведены для последовательности sequence of T. function Reverse(): sequence of T; Возвращает инвертированную
Читайте также: