将const char *转换为非const char *

时间:2014-11-20 09:54:41

标签: c++ casting pugixml

我正在用c ++编写一个程序来比较两个大型XML文件,并创建一个文件,其中包含已更改的产品(节点)的标识符和更改。为此,我使用的是pugixml

我目前正在以PHP开发人员的身份工作,而且已经有一段时间了,因为我使用了c ++所以我认为我忽略了一些微不足道的事情,但是经过几个小时的在线搜索后我仍然没有找到解决问题的方法,这是:

child_value函数只返给一个元素标签之间的值,返回一个const char *。我想要做的是将所有值放在一个数组中,并将它们与所有其他产品(在类似的数组中)的值进行比较。

当转到下一个产品时会出现问题,我需要覆盖数组中的值,我认为这是我得到的分段错误的起源。所以我的问题是:

我需要使用const char *进行比较,但我需要覆盖这些值,以便我可以进行下一次比较,最好的方法是什么?我已经尝试过strcpy,const_cast(如下面的示例代码中所示)和其他一些建议,但似乎都有结果 在相同的分段错误。

它会编译但是当它试图覆盖第一个值时它会在第二次迭代时崩溃。

for (xml_node groupCurrent = groupsCurrent.child("group");groupCurrent;groupCurrent = groupCurrent.next_sibling("group")){

    xml_node productsCurrent = groupCurrent.child("products");
    size_t nrProductsInGroupCurrent = std::distance(productsCurrent.children().begin(), productsCurrent.children().end());
    nrProductsTotalCurrent = nrProductsTotalCurrent + nrProductsInGroupCurrent;

    for (xml_node productCurrent = productsCurrent.child("product");productCurrent;productCurrent = productCurrent.next_sibling("product")){

        int numberAttributesC=0;
        char * childrenCurrent[32];

        for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling()){
            char * nonConstValue = const_cast<char *> (attributeCurrent.child_value());
            childrenCurrent[numberAttributesC]=nonConstValue;
            numberAttributesC++;
        }

        /*for(int i = 0;i<numberAttributesC;i++){
            std::cout<<childrenCurrent[i];
        }*/
        //xml_node groupsNew = docNew.child("product_database");

    }
}

非常感谢任何帮助,建议或评论。如果我自己找到解决方案,我会在这里发布。

此致 抗

PS:在ubuntu上使用gcc版本4.8.2

1 个答案:

答案 0 :(得分:0)

只需使用vector and string

即可
std::vector<std::string> childrenCurrent;

for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling())
{    
  std::string value = attributeCurrent.child_value();
  childrenCurrent.push_back(value);    
}

注意:我假设child_value正在返回const char*

string会复制子值,从而消除所有内存问题,使用vector可以省去管理潜在属性的数量。