如何一次使用 3 个字符的 switch 语句?
Posted
技术标签:
【中文标题】如何一次使用 3 个字符的 switch 语句?【英文标题】:how to use the switch statement for 3 characters at a time? 【发布时间】:2012-11-20 22:10:47 【问题描述】:我有一串不同的三个字母的单词:
catdogmattabratliematdogatt
我需要为每个单词分配一个字母并打印最终的字符串。
cat: P, dog: A, mat: T, tab: I, rat: E, lie: O, att: L
所以我的输出应该是:
PATIEOTAL
我尝试使用 switch 语句,但它不允许我一起输入 3 个字符。
【问题讨论】:
也许这会有所帮助:***.com/questions/11995568/… 这可能会有更多帮助:***.com/questions/1494399/… 【参考方案1】:使用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;
【讨论】:
我尝试使用 map 但它按字母顺序对我的键进行排序,这没有提供所需的输出 @sumrania:排序后的键会如何导致问题? 我刚刚在 att: L 处添加了一个新词相关性。使用地图时,它首先替换所有 atts,然后是 cat,然后是 dog。所以我的输出变成:PAmLabEOAL @Rollie:另一种可能性:您可以改为:string str(theString+i, 3);
。此外,map
不会重载 operator()
,它会重载 operator[]
,因此您需要 cout << wordToChar[str];
(并注意它会为任何不输入的输入打印一个空字符串(并将其插入到地图中) t 与您定义的匹配)。
@sumrania 这可能更多是您的替换算法的问题 - 您可以发布您正在使用的代码吗?【参考方案2】:
看来我可以在switch
语句中使用三个char
!它也不仅仅是我,而是一个称为“多字符文字”的标准功能(参见 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';
【讨论】:
【参考方案3】:由于您询问了使用 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;
然后你可以用这样一个简单的 main 函数来测试代码:
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
【讨论】:
以上是关于如何一次使用 3 个字符的 switch 语句?的主要内容,如果未能解决你的问题,请参考以下文章