C++如何用旧的值填充CxSt*()的新值

C++如何用旧的值填充CxSt*()的新值,c++,arrays,string,strcpy,C++,Arrays,String,Strcpy,我有一个静态数组,我只需要在某些区域进行更新 char* MapIds[5000] = { "Northeast Asia","Hanyang","Pusan","Pyongyang","Shanghai","Beijing","Hong Kong" /* 4999 more stuff */ }; 我有一个mapName,它是一个JSON对象,它可以给出一个字符串,我使用c_str将其转换为char* 我希望即使在JSON加载函数退出时也能使用字符串,因此我尝试将字符串复制到字符串文本数组中

我有一个静态数组,我只需要在某些区域进行更新

char* MapIds[5000] = { "Northeast Asia","Hanyang","Pusan","Pyongyang","Shanghai","Beijing","Hong Kong" /* 4999 more stuff */ };
我有一个mapName,它是一个JSON对象,它可以给出一个字符串,我使用c_str将其转换为char*

我希望即使在JSON加载函数退出时也能使用字符串,因此我尝试将字符串复制到字符串文本数组中。也不要接触我不必用新字符串替换的其他字符串索引。但它们都崩溃了,或者给出了空字符串

我尽量不使用std::string,而是使用char*,因为std::string对于巨大的初始化列表来说速度很慢

            int size = strlen(mapName.ToString().c_str());
            char* str = new char[size + 1];
            str[size] = '\0';
            //std::copy(mapName.ToString().c_str(), mapName.ToString().c_str() + size, MapIds[std::stoi(mapId.ToString().c_str())]); //fails
            //strcpy(MapIds[std::stoi(mapId.ToString().c_str())], mapName.ToString().c_str()); //fails
            //MapIds[std::stoi(mapId.ToString().c_str())] = mapName.ToString().c_str(); //fails
            //sprintf(MapIds[std::stoi(mapId.ToString().c_str())], "%s", mapName.ToString().c_str()); //fails
            MapIds[0] = "gfggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"; //this good

            printf("map0 = %s, map1 = %s, map2 = %s\n", MapIds[0], MapIds[1], MapIds[2]);
我尝试将字符串复制到字符串文本数组中

<>你想做的不是合法的C++。char*MapIds[5000]=。。。应该是const char*MapIds[5000]=。。。试图覆盖该数组中的任何内容会使程序具有未定义的行为

我尽量不使用std::string,而是使用char*,因为std::string对于巨大的初始化列表来说[编译]很慢

            int size = strlen(mapName.ToString().c_str());
            char* str = new char[size + 1];
            str[size] = '\0';
            //std::copy(mapName.ToString().c_str(), mapName.ToString().c_str() + size, MapIds[std::stoi(mapId.ToString().c_str())]); //fails
            //strcpy(MapIds[std::stoi(mapId.ToString().c_str())], mapName.ToString().c_str()); //fails
            //MapIds[std::stoi(mapId.ToString().c_str())] = mapName.ToString().c_str(); //fails
            //sprintf(MapIds[std::stoi(mapId.ToString().c_str())], "%s", mapName.ToString().c_str()); //fails
            MapIds[0] = "gfggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"; //this good

            printf("map0 = %s, map1 = %s, map2 = %s\n", MapIds[0], MapIds[1], MapIds[2]);

制作一个std::vector或std::array,将其自身放入一个.cpp文件中,并制作一个带有外部声明的头文件。只有当您需要更新该向量时,您才会注意到编译它所需的额外时间。

std::string也会使您的问题完全消失。您的MAPID如何知道哪些字符串是静态分配的,哪些字符串是动态分配的?你在管理内存吗?所以当你说但是它们都崩溃了或者给出了空字符串时,你是说你试图访问的每个MAPID条目都崩溃了?你应该努力加入一份明确表明你的问题的报告。你肯定可以打印MAPID吗?然后调用MapIds[0]=gfg。。。。可以吗?我尽量不使用std::string,而是使用char,因为std::string对于巨大的初始化列表来说速度很慢*-您要初始化列表多少次?如果只是一次,那么这是一次性的,不会不断地重复执行。我只是想,当旧技术以同样的方式工作时,使用新技术有什么意义?不,它没有-如果你使用std::string,你甚至不会有这个问题。您有5行代码:1行用于初始化,3行用于更改其中3行的值,1行用于打印整个内容。当[c样式字符串]以同样的方式工作时,使用[std::string]有什么意义。。。?你的代码不起作用。我不会把它称为同样的工作方式。@SSpoke-事实上,不,在70-90年代早期使用C的人也没有做你描述的事情。你似乎有一种错觉,认为有些事情在当时是容易的,而现在是困难的。是的,有时人们——大多数是初学者——会认为他们可以做你描述的事情。他们将得到一堆很难得到正确答案的代码,这些代码很容易修改,例如,小的修改会突然发现需要查找的bug。值得称职的专业人士学会了不做这样的事情。