2012-11-03 4 views
0

sprintf 함수를 압축하는 함수를 작성하려고하는데 어떻게 든 다음 문제에 부딪혔습니다.C++ 문자 배열이 손상 되었습니까?

클래스를 호출 한 후의 첫 번째 줄은 함수 였지만 작동하지 않았습니다. 나는 완전히 다른 무언가를 얻을 후 나는 심지어 클래스 또는 변수 만지지 않았지만, http://puu.sh/1m1Bw

그러나 행 : http://puu.sh/1m1BR

누군가가 여기서 무슨 일이 있었는지 나에게 설명 할 수를 중) 나는 정확한 결과를 얻을?

편집 :

StringCreator::StringCreator(char* _parten, ...) { 
     char buff[255]; 

     va_list args; 
     va_start (args, _parten); 
     vsprintf (buff,_parten, args); 
     va_end(args); 

     this->str = buff; 
    } 

그리고 .H 파일에

: 그것은 StringCreator() 생성자가 완료되면

class StringCreator { 
public: 
    StringCreator(char* _parten, ...); 
    char* str; 
}; 
+3

아니요. 코드를 표시하지 않으면 무슨 일이 일어나는지 설명 할 수 없습니다 ... – Jasper

+3

코드에 오류가 있습니다. –

+0

와우 촬영, 클래스 fotgot : StringCreator :: StringCreator (char * _parten, ...) { \t \t char buff [255]; \t \t va_list args; \t \t va_start (args, _parten); \t \t vsprintf (buff, _parten, args); \t \t va_end (args); \t \t this-> str = buff; \t} – Thijs

답변

2

멤버 변수 this->str는 허상 포인터가 가리키는대로 실제 클래스를 잊어 버렸 생성자의 로컬 변수 인 buff으로 변경하십시오. 생성자 뒤에 this->str에 액세스하면 정의되지 않은 동작입니다. strchar*에서 std::string으로 변경하는 것은 해결책이며 const char*에 액세스해야하는 경우 str.c_str()을 사용할 수 있습니다. std::string을 사용하면 기본 복사 생성자와 대입 연산자가 정확하다는 것을 의미합니다. 이 답변에 코멘트에 표시된대로

하면, 당신 new char[255], 다음 중 하나 StringCreator 비 복사 가능한하거나 복사 생성자와 복사 str의 내용을 할당 연산자를 구현해야하는 대신 std::string를 사용. What is The Rule of Three?을 참조하십시오. char str[255];을 사용하고 동적 할당을 피하고 StringCreator의 기본 복사가 정확할 수 있습니다.

vsprintf()에 대한 호출에서 잠재적 인 버퍼 오버런을 방지하려면 (컴파일러에서 C99을 지원하는 경우) 대신 vsnprintf()을 사용하십시오.이 경우 채워지는 버퍼의 크기가 인수로 받아 들여지고 지정된 크기를 초과하여 쓰지 않습니다.

+0

물론! 고맙습니다! 그것을'code'로 변경했습니다. \t StringCreator :: StringCreator (char * _parten, ...) { \t \t str = new char [255]; \t \t va_list args; \t \t va_start (args, _parten); \t \t vsprintf (str, _parten, args); \t \t va_end (args); \t} – Thijs

관련 문제