C++ 如何将switch语句一次使用3个字符?

C++ 如何将switch语句一次使用3个字符?,c++,string,stl,C++,String,Stl,我有一系列不同的3个字母的单词: catdogmattabratliematdogatt 我需要为每个单词分配一个字母表并打印最后的字符串 cat: P, dog: A, mat: T, tab: I, rat: E, lie: O, att: L 因此,我的输出应该是: PATIEOTAL 我尝试使用switch语句,但它不允许我同时输入3个字符。使用映射执行以下操作: map<string, char> wordToChar; // Load wordToChar appr

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

catdogmattabratliematdogatt
我需要为每个单词分配一个字母表并打印最后的字符串

cat: P, dog: A, mat: T, tab: I, rat: E, lie: O, att: L
因此,我的输出应该是:

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

使用
映射执行以下操作:

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-wordToChar;
//适当加载wordToChar;为了简单起见,您可以使用初始值设定项列表
对于(int i=0;imap
执行以下操作:

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-wordToChar;
//适当地加载wordToChar;为了简单起见,c++11可以使用初始值设定项列表
对于(int i=0;icout看来我可以在一个
开关
-语句中使用三个
char
!这也不仅仅是我,而是一个称为“多字符文字”的标准特性(参见2.14.3[lex.ccon]第1段;这些野兽的类型是
int
)。我并不是建议任何人使用这种方法,但它是有效的,尽管字符在计算中可能需要反转,这取决于系统的长度(我不确定细节)。下面是一个完整的示例(尽管输入需要单独的单词,而不是需要分开的字符串):

#包括
#包括
int main(int ac,char*av[])
{
typedef无符号字符u;
for(int i(1);i!=ac;++i){
if(strlen(av[i])==3)
{

std::cout似乎我可以在
开关
-语句中使用三个
char
!它也不仅仅是我,而是一个称为“多字符文字”的标准特性(参见2.14.3[lex.ccon]第1段;这些野兽的类型是
int
)。我并不是建议任何人使用这种方法,但它是有效的,尽管字符在计算中可能需要反转,这取决于系统的长度(我不确定细节)。下面是一个完整的示例(尽管输入需要单独的单词,而不是需要分开的字符串):

#包括
#包括
int main(int ac,char*av[])
{
typedef无符号字符u;
for(int i(1);i!=ac;++i){
if(strlen(av[i])==3)
{

std::cout既然您询问如何使用switch语句,我认为可以接受一个硬编码的3个字母单词及其对应字母的列表。在这种情况下,我将使用一系列if-then-else语句来解决这个问题,每个语句都试图匹配3个字母单词的字符。或者,您可以se嵌套了switch语句,但语法使该解决方案更难阅读

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

既然您询问过如何使用switch语句,我认为可以接受一个硬编码的3个字母单词及其对应字母的列表。在这种情况下,我将使用一系列if-then-else语句来解决这个问题,每个语句都试图匹配3个字母单词的字符。或者,您可以使用嵌套语句switch语句,但语法使该解决方案更难阅读

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

可能会有帮助:可能会有更多帮助:可能会有帮助:可能会有更多帮助:我尝试使用map,但它按字母顺序对我的键进行排序,但没有给出所需的output@sumrania:排序的键如何导致问题?我刚刚添加了一个新词correlation,其中att:L。使用映射时,它首先替换所有att,然后替换ca然后是dog。所以我的输出变成:PAmLabEOAL@Rollie:还有一种可能性:您可以这样做:
string str(字符串+i,3);
。另外,
map
不会重载
operator()
,而是重载
operator[]
,所以您希望
cout@sumrania这可能是您的替换算法的一个更大的问题-您可以发布您正在使用的代码吗?我尝试使用map,但它按字母顺序对我的键进行排序,但没有给出所需的output@sumrania:排序键如何导致问题?我刚刚添加了一个新词correlation,其中att:L。当使用地图时,它首先替换所有ATT,然后是cat,然后是dog。因此,我的输出变成:PAmLabEOAL@Rollie:还有一种可能性:您可以这样做:
string str(字符串+i,3);
。另外,
map
不会重载
operator()
,而是重载
operator[]
,所以您希望
cout@sumrania更像是您的替换算法的问题-您可以发布您正在使用的代码吗?