如何一次使用3个字符的switch语句?

时间:2012-11-20 22:10:47

标签: c++ string stl

我有一串不同的3个字母的单词:

catdogmattabratliematdogatt

我需要用字母分配每个单词并打印最终字符串。

cat: P, dog: A, mat: T, tab: I, rat: E, lie: O, att: L

所以我的输出应该是:

PATIEOTAL

我尝试使用switch语句,但它不允许我一起输入3个字符。

3 个答案:

答案 0 :(得分:4)

使用map<string, char>执行以下操作:

map<string, char> wordToChar;
// Load wordToChar appropriately; c++11 you can use an initializer list for simplicity

for (int i = 0; i < strLen; i += 3)
{
  string str;
  str.push_back(theString[i]);
  str.push_back(theString[i+1]);
  str.push_back(theString[i+2]);
  cout << wordToChar[theString] << endl;
}

答案 1 :(得分:0)

似乎我可以在char声明中使用三个switch!它不仅仅是我,而是一个称为“多字符文字”的标准特征(见2.14.3 [lex.ccon]第1段;这些野兽的类型是int)。并不是我会建议任何人使用这个hack但是它可以工作,虽然根据系统的Endianess,我可能需要在计算中反转字符(我不确定那个细节)。这是一个完整的例子(虽然输入需要单独的单词而不是一个需要分开的字符串):

#include <iostream>
#include <string.h>

int main(int ac, char* av[])
{
    typedef unsigned char u;
    for (int i(1); i != ac; ++i) {
        if (strlen(av[i]) == 3) 
        {
            std::cout << std::hex;
            int value(u(av[i][2])
                      + 256u * (u(av[i][1])
                                + 256u * u(av[i][0])));
            switch (value) {
            default:
                std::cout << "option not found!: '" << av[i] << "'\n";
                break;
            case 'cat': std::cout << 'P'; break;
            case 'dog': std::cout << 'A'; break;
            case 'mat': std::cout << 'T'; break;
            case 'tab': std::cout << 'I'; break;
            case 'rat': std::cout << 'E'; break;
            case 'lie': std::cout << 'O'; break;
            case 'att': std::cout << 'L'; break;
            }
        }
    }
    std::cout << '\n';
}

答案 2 :(得分:0)

由于您询问了如何使用switch语句,我认为拥有一个3字母单词及其相应字母的硬编码列表是可以接受的。在这种情况下,我将使用if-then-else语句序列解决此问题,每个语句都尝试匹配3个字母单词的字符。或者,您可以使用嵌套的switch语句,但语法使得该解决方案更难以阅读IMO。

static char match_word(std::string const &str, std::size_t offset)
{
  char ret = '?';
  if (str[offset + 0] == 'c' && str[offset + 1] == 'a' && str[offset + 2] == 't') {
    ret = 'P';
  }
  else if (str[offset + 0] == 'd' && str[offset + 1] == 'o' && str[offset + 2] == 'g') {
    ret = 'A';
  }
  else if (str[offset + 0] == 'm' && str[offset + 1] == 'a' && str[offset + 2] == 't') {
    ret = 'T';
  }
  else if (str[offset + 0] == 't' && str[offset + 1] == 'a' && str[offset + 2] == 'b') {
    ret = 'I';
  }
  else if (str[offset + 0] == 'r' && str[offset + 1] == 'a' && str[offset + 2] == 't') {
    ret = 'E';
  }
  else if (str[offset + 0] == 'l' && str[offset + 1] == 'i' && str[offset + 2] == 'e') {
    ret = 'O';
  }
  else if (str[offset + 0] == 'a' && str[offset + 1] == 't' && str[offset + 2] == 't') {
    ret = 'L';
  }
  return ret;
}

然后你可以用一个简单的主函数测试代码:

int main(int argc, char **argv)
{
  if (argc != 2) {
    std::cerr << "USAGE: " << argv[0] << " ENCODED" << std::endl;
    return 1;
  }
  else {
    std::string example(argv[1]);
    for (std::size_t idx = 0; idx < example.size(); idx += 3) {
      std::cout << match_word(example, idx);
    }
    std::cout << std::endl;
    return 0;
  }
}

然后只运行带有编码字符串的程序作为唯一的参数,如下所示:

$ ./a.out catdogmattabratliematdogatt
PATIEOTAL