-4

如何更改用户输入字符,例如。"abcDEF" 并在不使用 atoi 或 stringstream 的情况下返回输出 "222333"

使用传统的 SMS 思想,其中 2 等于 abc 3 等于 def 4 等于 ghi 等等。

4

2 回答 2

2

您可以使用查找键映射然后转换您的字符串。带有 C++11 lambda 和 C++03 的示例:

static std::map<char, char> keyMap;

struct GetKey
{
  char operator()(char c)
  {
      return keyMap[c];
  } 
};

void InitKeyMap(std::map<char, char>& keys)
{
  keys['a'] = '2';
  keys['b'] = '2';
  keys['c'] = '2';
  keys['D'] = '3';
  keys['E'] = '3';
  keys['F'] = '3';
}

int main ()
{ 
  InitKeyMap(keyMap);
  std::string s1 = "abcDEF";

  // C++11 with lambda
  std::transform(s1.begin(), s1.end(), s1.begin(),
  [](const char c)->char{  return keyMap[c];});

  // C++03 
  std::transform(s1.begin(), s1.end(), s1.begin(), GetKey());

  cout << s1 << std::endl;

  return 0 ;
}
于 2013-01-27T09:46:20.290 回答
0

您可以保存一个表格,将每个字母映射到一个数字,例如:

#include <iostream>
#include <string>

std::string convert(const std::string& map, const std::string& input)
{
    std::string output(input.size(), '0');

    for (int i=0; i < input.size(); i++)
    {
        output[i] = map[input[i]];
    }
    return output;
}

int main(int argc, char* argv[])
{
    std::string charMap(128, '0');
    // init table
    charMap['a']='2';
    charMap['A']='2';
    charMap['b']='2';
    // init all values ...

    std::string input("aAb");
    std::string result(convert(mapping, input));
    std::cout << result << std::endl;

    return 0;
}

编辑

我对这个答案的最初意图是为操作员提供使用 LUT 的基本概念,并为他提供一个直接(技术上正确)的解决方案来解决他的问题。我没想到所有严厉的评论。我将解决方案更改为多一点 C++ 而少一点 C。C++ 中显然有更多的方法和其他机制来解决这个问题。

于 2013-01-27T09:36:28.150 回答