我确实得到了字符串(hello-->ifmmp)
上的下一个字符,但是在hello *的情况下我希望能够仍然显示*作为例外,它也可以是一个数字但是我猜它没关系,因为它不在字母表中。
这是我的代码,如果是其他应该在哪里呢?有另一种选择,但我没有找到它优化,它是在第一个for循环内添加:
string other="123456789!@#$%^&*()";
for(int z=0;z<other.length();z++)
{
if(str[i]==other[z])
str2+=other[z];
}
那么这是主要代码;
int main()
{
string str = "hello*";
string str2="";
string alphabet = "abcdefghijklmnopqrstuvwxyz";
for(int i=0;i<str.length();i++)
{
for(int j=0;j<alphabet.length();j++)
{
if(str[i]==alphabet[j])
{
str2+=alphabet[j+1];
}
}
}
cout<<str2<<endl;
return 0;
}
我喜欢功能。他们解决了很多问题。例如,如果您使用已有的代码,将其粘贴到函数中,并进行一些调整
char findreplacement(char ch, const std::string & alphabet)
{
for (int j = 0; j < alphabet.length(); j++)
{
if (ch == alphabet[j])
{
return alphabet[(j+1) % alphabet.length()];
// return the replacement character
// using modulo, %, to handle wrap around z->a
}
}
return ch; // found no replacement. Return original character.
}
你可以调用这个函数
for (int i = 0; i < str.length(); i++)
{
str2 += findreplacement(str[i], alphabet);
}
建立str2
。考虑在这里使用基于范围的for
:
for (char ch: str)
{
str2 += findreplacement(ch, alphabet);
}
搞砸了,更难搞砸了。
标准库中有一个函数isalpha
,它对分类非常有用。
你可以这样做。
(这种练习通常采用英文字母的ASCII编码,这是一种非常特定于ASCII的解决方案。如果你想要一个不同的字母或不同的字符编码,你需要自己处理。)
#include <cctype>
#include <string>
#include <iostream>
int main()
{
std::string str = "Hello*Zzz?";
std::string str2;
for (char c: str)
{
if (std::isalpha(c))
{
c += 1;
if (!std::isalpha(c))
{
// Went too far; wrap around to 'a' or 'A'.
c -= 26;
}
}
str2 += c;
}
std::cout << str2 << std::endl;
}
输出:
Ifmmp*Aaa?