使用字符串和枚举映射时,开关执行第一种情况,而不是默认情况

问题描述 投票:0回答:1

我想使用映射到枚举成员的字符串。枚举值稍后将在开关中使用,以确定将执行哪些功能。我有以下代码:

#include <iostream>
#include <string>
#include <map>

#define MSG_BUFSIZE 100

enum CMDVAL
{
    CMD_USEREXIT,
    CMD_LOGIN
};

std::map<std::string, CMDVAL> map_cmdval;

void initCmdmap()
{
    map_cmdval["exit"] = CMD_USEREXIT;
    map_cmdval["login"] = CMD_LOGIN;
}

bool RUNNING = true;

int main()
{
    initCmdmap();
    char buffer[MSG_BUFSIZE];

    while(RUNNING)
    {
        memset(buffer, '\0', MSG_BUFSIZE);
        std::cin.getline(buffer, MSG_BUFSIZE);

        switch (map_cmdval[buffer])
        {
            case CMD_USEREXIT:
                RUNNING = false;
                printf("Exiting...\n");
                break;
            case CMD_LOGIN:
                printf("Logging in...\n");
                break;
            default:
                printf("Invalid command\n");
                break;
        }
    }
}

这会编译,但是,如果我尝试输入与映射中已定义的单词不同的单词,则将执行CMD_USEREXIT情况,而不是默认情况。我想念什么?最重要的是为什么会这样?

c++ string dictionary enums stl
1个回答
1
投票

当您查看std::map::operator[]

返回对映射到与键等效的键的值的引用,如果该键尚不存在,则执行插入

这意味着,当您从标准输入中读取值std::map::operator[]时,将插入一个默认值为0的新元素foo

[map_cmdval["foo"]的定义等同于

enum CMDVAL

[enum CMDVAL为您提供的值为0,与enum CMDVAL { CMD_USEREXIT = 0, CMD_LOGIN = 1 }; 相同。

© www.soinside.com 2019 - 2024. All rights reserved.