将每个字母替换为其在给定字符串的字母表中的位置

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.....

  1. 最好避开using namespace std;。看这里:Why is "using namespace std;" considered bad practice?

  2. 你的主要错误是在这一行:

    for (int z : aplha_numbers)

    您遍历分配数组中的所有 100 个元素,而不仅仅是有效条目。 在我的解决方案中根本不需要这样的数组。 stringstream 对象直接更新。

  3. 小写字符c的位置就是c-'a'+1。不需要查找 table(至少假设是 ascii 输入)。

  4. 无需通过将输入字符串变为小写来实际更改输入字符串。这可以在您遍历它时即时完成。

完整代码如下:

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