在 while 循环中向 std::map 添加条目会覆盖最后输入的对

Adding an entry to std::map in a while loop overwrites last entered pair

问题: 我在 while 循环中向地图添加条目,每次它都从同一点开始,我。 e.之前输入的条目是 dismissed/overwritten.

代码:

#include <iostream>
#include <map>

int main(){
    char* key=new char;
    char *name, *address;
    name=new char[80];
    address=new char[80];
    std::map<char*, char*> addressBook;
    while(true){
        std::cout<<"Please select action: \n";
        std::cout<<"e - exit\n";
        std::cout<<"a - add new address\n";
        std::cout<<"p - print address book\n";
        std::cin>>key;
        switch(key[0]){
            case 'a':
                std::cin>>name>>address;
                std::cin.clear();
                std::cin.ignore(500,'\n');
                addressBook[name]=address;
                std::cout<<addressBook.size()<<"\n";
                break;
            case 'p':
                for(std::map<char*,char*>::iterator it = addressBook.begin();it!=addressBook.end(); ++it)
                    std::cout<<it->first<<" "<<it->second<<"\n";
                break;
            default:
                return 0;
        }
    }
}

设置: Code::Blocks 与 MinGW/gcc 4.7.1

使用找到的插入方法 Here。如前所述,您这样做的方式只会覆盖最后一个密钥。

您只是将 char * 存储在地图(指针)中,而不是指针的值。同一个指针不断被反复存储,用户输入只是改变指向的内容。

您真的想要 std::map<std::string, std::string>,而不是 std::string,而不是 char *。一条经验法则是,在现代 C++ 中,您几乎不必使用 new.