将每个字母替换为其在给定字符串的字母表中的位置
Replace every letter with its position in the alphabet for a given string
第一步,我将字符串更改为小写,之后我从字符串中删除了所有非字母,现在我正在努力用字母位置替换每个字母。
有谁知道如何做这样的事情?
谢谢!
string alphabet_position(string message){
string alphabet= "abcdefghijklmnopqrstuvwxyz";
int aplha_numbers[100];
for_each(message.begin(), message.end(), [](char & c){
c = ::tolower(c);
});
for(int i=0; i< message.size(); i++){
if(message[i] < 'a' || message[i] > 'z'){
message.erase(i, 1);
i--;
}
}
for(int j=0; j<message.size(); j++){
int index = alphabet.find(message[j]);
aplha_numbers[j]= index +1;
}
std::ostringstream os;
for(int z: aplha_numbers){
os<<z;
}
std::string str(os.str());
return str;
}
现在我有一个不同的问题,我得到了字母表的位置,但在最后一个字母之后我也得到了很多垃圾值。
例如输入:abc
输出 123 之后是很多数字 32761004966.....
最好避开using namespace std;
。看这里:Why is "using namespace std;" considered bad practice?
你的主要错误是在这一行:
for (int z : aplha_numbers)
您遍历分配数组中的所有 100 个元素,而不仅仅是有效条目。
在我的解决方案中根本不需要这样的数组。 stringstream
对象直接更新。
小写字符c
的位置就是c-'a'+1
。不需要查找 table(至少假设是 ascii 输入)。
无需通过将输入字符串变为小写来实际更改输入字符串。这可以在您遍历它时即时完成。
完整代码如下:
#include <string>
#include <sstream>
#include <iostream>
#include <cctype>
std::string alphabet_position(std::string message)
{
std::ostringstream os;
for (auto const & c : message)
{
char c_lower = std::tolower(c);
if (c_lower < 'a' || c_lower > 'z') continue;
int pos = c_lower - 'a' + 1;
os << pos;
}
return os.str();
}
int main()
{
std::string s_in = "AbC";
std::string s_out = alphabet_position(s_in);
std::cout << "in:" << s_in << ", out:" << s_out << std::endl;
return 0;
}
第一步,我将字符串更改为小写,之后我从字符串中删除了所有非字母,现在我正在努力用字母位置替换每个字母。 有谁知道如何做这样的事情? 谢谢!
string alphabet_position(string message){
string alphabet= "abcdefghijklmnopqrstuvwxyz";
int aplha_numbers[100];
for_each(message.begin(), message.end(), [](char & c){
c = ::tolower(c);
});
for(int i=0; i< message.size(); i++){
if(message[i] < 'a' || message[i] > 'z'){
message.erase(i, 1);
i--;
}
}
for(int j=0; j<message.size(); j++){
int index = alphabet.find(message[j]);
aplha_numbers[j]= index +1;
}
std::ostringstream os;
for(int z: aplha_numbers){
os<<z;
}
std::string str(os.str());
return str;
}
现在我有一个不同的问题,我得到了字母表的位置,但在最后一个字母之后我也得到了很多垃圾值。 例如输入:abc 输出 123 之后是很多数字 32761004966.....
最好避开
using namespace std;
。看这里:Why is "using namespace std;" considered bad practice?你的主要错误是在这一行:
for (int z : aplha_numbers)
您遍历分配数组中的所有 100 个元素,而不仅仅是有效条目。 在我的解决方案中根本不需要这样的数组。
stringstream
对象直接更新。小写字符
c
的位置就是c-'a'+1
。不需要查找 table(至少假设是 ascii 输入)。无需通过将输入字符串变为小写来实际更改输入字符串。这可以在您遍历它时即时完成。
完整代码如下:
#include <string>
#include <sstream>
#include <iostream>
#include <cctype>
std::string alphabet_position(std::string message)
{
std::ostringstream os;
for (auto const & c : message)
{
char c_lower = std::tolower(c);
if (c_lower < 'a' || c_lower > 'z') continue;
int pos = c_lower - 'a' + 1;
os << pos;
}
return os.str();
}
int main()
{
std::string s_in = "AbC";
std::string s_out = alphabet_position(s_in);
std::cout << "in:" << s_in << ", out:" << s_out << std::endl;
return 0;
}