Как сохранить значения значений элемента, но он ссылается на конечный адрес - PullRequest
1 голос
/ 25 января 2011

когда я сохраняю данные в массив после выполнения анализа XML-файла, мы должны сохранить его в массиве, но здесь он хранится как конечный адрес XML-файла, т.е. он хранит все значения, но проблема в том, что все значения ссылаясь на один адрес, поэтому я использовал вектор для получения всех значений, поэтому есть ли возможность получить все значения без использования каких-либо предопределенных методов.

Мой код похож на

while(attr){            
                if(!xmlStrcmp(attr->name,(const xmlChar *)"user")){
                    sprintf((char *)UserName.c_str(),"%s",attr->children->content);
                    std::cout<<"UserName: "<<UserName.c_str()<<"\t\t";
                    UN.push_back(UserName.c_str());
                }
                if(!xmlStrcmp(attr->name,(const xmlChar *)"password")){
                    sprintf((char *)Password.c_str(),"%s",attr->children->content);
                    std::cout<<"Password: "<<Password.c_str()<<std::endl;
                    PWD.push_back(Password.c_str());
                }
                attr=attr->next;
            }

даже векторы, у меня та же проблема, так как я могу решить эту проблему.

1 Ответ

1 голос
/ 02 февраля 2011

Я думаю, что проблема в том, что вы храните значения где-то в vector, которые не должны храниться постоянно. В частности, эта строка:

UN.push_back(UserName.c_str());

Кажется, что сохраняет результат UserName.c_str() в vector<const char*>. Если вы сделаете это, то у вас возникнут проблемы, как только вы измените строку UserName или когда эта строка выйдет из области видимости. Значение c_str() довольно хрупкое - оно недопустимо после выполнения каких-либо действий с исходной строкой - и существует главным образом для того, чтобы вы могли взять строковые данные и передать их в код C, которому в качестве аргумента требуется const char*.

Чтобы исправить это, я бы предложил либо явно скопировать строки перед тем, как вставить их в вектор:

UN.push_back(strdup(UserName.c_str());

(Вы не должны использовать strdup здесь; это просто пример)

В качестве альтернативы рассмотрите возможность хранения std::string s в vector, который владеет строковым ресурсом, на который они указывают, и не имеет этой проблемы.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...