2011-01-25 4 views
1

xmlファイルを解析した後に配列にデータを格納するときには、配列に格納する必要がありますが、xmlファイルの最終アドレスつまり、すべての値を格納しますが、すべての値が1つのアドレスを参照しているため、すべての値を取得するためにベクトルを使用しています。したがって、事前定義されたメソッドを使用せずにすべての値を取得する可能性があります。私はこの問題を解決することができますどのように私のコードは次のようである要素値の値を格納する方法ですが、最終アドレスを参照しています

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; 
      } 

さえベクターはまた、私は同じ問題を取得しています。

+0

なぜあなたは 'sprintf'を使用していますか? 'ベクトル'を作成し、その値をコピーするのはどうですか?なぜあなたは 'vector'を使いたくないのですか? – Naveen

+4

複数の理由から、 'sprintf((char *)UserName.c_str()、"%s "、attr-> children-> content);' <この行は、Baby Jesusが泣くだけではなく、子猫。 –

+1

@ Naveenの編集でも、この質問はほとんど意味をなさない。英語では、** sentances **と呼ばれるものがあります。 –

答えて

1

私は問題は、永久に格納されていないと考えられるvectorのどこかに値を格納していることだと思います。具体的には、この行は:

UN.push_back(UserName.c_str()); 

vector<const char*>UserName.c_str()に結果を格納するように思われます。これを行うと、UserName文字列を変更したり、文字列が範囲外になったりするとすぐに問題が発生します。 c_str()の値はかなり壊れやすいものです。ソース・ストリングに対して何かをしても有効ではありません。文字列データをとり、それを引数としてconst char*が必要なCコードに渡すことができるようにします。

この問題を解決するために、私はベクターにそれらを挿入する前にどちらかが明示的に文字列をコピーすることをお勧め:

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

(ここにstrdupを使用する必要はありません、それは単なる例です)

または、vectorstd::stringを格納することを検討してください。vectorは、この問題が発生していない文字列リソースを所有しています。

希望すると便利です。

関連する問題