как использовать оператор switch для 3 символов одновременно?

У меня есть строка из трех 3-х буквенных слов:

catdogmattabratliematdogatt

Мне нужно присвоить каждому из слов алфавит и напечатать окончательную строку.

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

поэтому мой вывод должен быть:

PATIEOTAL

Я попытался использовать оператор switch, но он не позволяет мне вводить 3 символа вместе.

0

Решение

Использовать 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;
}
4

Другие решения

Кажется, я могу использовать три char в switch-заявление! Это также не только я, но и стандартные функции, называемые литералами с несколькими символами (см. 2.14.3 [lex.ccon], параграф 1; тип этих зверей: int). Не то, чтобы я советовал кому-либо использовать этот хак, но он работает, хотя символы могут нуждаться в обратном вычислении в зависимости от 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';
}
0

Поскольку вы спрашивали об использовании операторов switch, я предполагаю, что было бы приемлемо иметь жестко запрограммированный список 3-буквенных слов и их соответствующих букв. В этом случае я бы решил эту проблему, используя последовательность операторов if-then-else, каждое из которых пыталось бы сопоставить символы трехбуквенных слов. В качестве альтернативы, вы можете использовать вложенные операторы 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
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector