Как сделать реверс string c

Обновлено: 04.07.2024

Как перевернуть строку в 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 ) начинаем цикл, который выводит массив в обратном порядке. Задача решена.

Ссылки

Алексеев Максим

Вергелес Владислав

Дариенко Дмитрий

Евчук Даяна

Ежкова Алина

Жук Светлана

Иванов Александр

Константинов Евгений

Кулик Виталий

Ливитчук Максим

Михайлищук Валентина

Федяєва Евгения

Чачко Натан

Опубликованные решения:

  1. Зарегистрируйтесь на сайте подготовки к собеседованиям или войдите в свой аккаунт. Будет лучше, если Вы сделаете это используя уже имеющийся аккаунт на Facebook. Для этого есть соответствующая кнопка внизу окна регистрации (sign up).
  2. Перейдите по ссылке в раздел работы со строками. Если перейти не удалось, значит Вы ещё не выполнили предыдущий пункт инструкции.
  3. Познакомьтесь со всеми материалами и решите все предлагаемые задачи.

Если в качестве домашнего задания на эту тему Вам достались задачи из задачника А.Абрамова А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; Возвращает инвертированную

Читайте также: