Как я могу сдвинуть буквы строки в C ++ 17? - PullRequest
0 голосов
/ 18 октября 2018

Например, переход от «Привет» к «Jk» путем перемещения вперед по алфавиту на две буквы.

До сих пор я пробовал это:

string myString = 'Hello';
string shifted = myString + 2;
cout << shifted << endl;

Что работаетдля символов, но ничего не будет делать для строк.Есть ли что-нибудь еще, что будет работать?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Использование std::transform.

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    std::string s("hello");
    std::transform(s.begin(), s.end(), s.begin(),
                   [](unsigned char c) -> unsigned char { return c + 2; });

    // if you don't want to flush stdout, you may use "\n" instead of "\n"
    std::cout << s << std::endl;
}

Как это работает, работает с помощью обратного вызова для каждого символа и преобразует строку на месте.

Обратный вызов просто добавляет 2 ксимвол без знака:

[](unsigned char c) -> unsigned char { return c + 2; }

Остальное просто:

std::transform(s.begin(), s.end(), s.begin(), callback);

Простой, расширяемый и легко читаемый.

0 голосов
/ 18 октября 2018

Используйте цикл:

std::string myString = "Hello";
std::string shifted;

for (auto const &ch : myString)
    shifted += ch + 2;

std::cout << shifted << '\n';

Если вы хотите сместить только буквы и сделать их обтеканием, если смещенное значение будет >'Z' или >'z':

#include <string>
#include <cctype> // std::islower(), std::isupper()

// ...

for (auto const &ch : myString) {
    if (std::islower(static_cast<char unsigned>(ch)))  // *)
        shifted += 'a' + (ch - 'a' + shift) % ('z' - 'a' + 1);

    if (std::isupper(static_cast<char unsigned>(ch)))
        shifted += 'A' + (ch - 'A' + shift) % ('Z' - 'A' + 1);
}

*) Не вводите эти функции отрицательные значения.

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