2011-01-25 8 views
1

배열에 데이터를 저장할 때 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; 
      } 

도 벡터도, 정말 같은 문제를 얻고있다.

+0

왜'sprintf'를 사용하고 있습니까? 왜 '벡터 '을 만들고 그 값을 복사하지 않겠습니까? 왜 '벡터'를 사용하고 싶지 않은가? – Naveen

+4

여러 가지 이유로,'sprintf ((char *) UserName.c_str(), "% s", attr-> children-> content);'이 줄은 아기 예수를 울게 만하지는 않는다. 새끼 고양이. –

+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을 저장하는 것을 고려하십시오. 이들은 자신이 가리키는 문자열 리소스를 소유하고 있으며이 문제가 없습니다.

희망이 도움이됩니다.

관련 문제