如何在C ++ 17中移动字符串的字母?

时间:2018-10-17 21:12:00

标签: c++ c++17

例如,通过将字母向前移动两个字母,从“ Hi”变为“ Jk”。

到目前为止,我已经尝试过:

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

哪个字符适合字符,但对字符串不做任何事情。还有其他可行的方法吗?

2 个答案:

答案 0 :(得分:4)

使用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);

简单,可扩展且易于阅读。

答案 1 :(得分:3)

使用循环:

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);
}

*)不要向这些函数提供负值。