例如,通过将字母向前移动两个字母,从“ Hi”变为“ Jk”。
到目前为止,我已经尝试过:
string myString = 'Hello';
string shifted = myString + 2;
cout << shifted << endl;
哪个字符适合字符,但对字符串不做任何事情。还有其他可行的方法吗?
答案 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);
}
*)不要向这些函数提供负值。