2010-03-05 2 views
6

printf 문제가 있습니다. 여기 좀 도와 줄 수 있으면 감사하겠습니다 : 아래의 코드에서 글꼴 패밀리가 처음으로 printf(), 에 올바르게 배치 된 것을 볼 수 있습니다. 그러나 변수를 설정하면 빈 문자열 만 얻습니다. 변수에 넣고 올바른 값을 가질 수 있습니까? 나는 'font.family(). family(). string(). utf8(). data()'를 어디서나 입력하고 싶지 않습니다.const char * 변수를 사용하여 printf 질문

나는 동일한 방법으로 이런 짓을 :

void myMethod() { 
     const char* fontFamily = font.family().family().string().utf8().data(); 
     // get displayed correctly 
     printf ("drawText1 %s \n", font.family().family().string().utf8().data()); 
     // get an empty string 
     printf ("drawText2 %s \n", fontFamily); 
} 

와의 서명 '데이터는()'

class CString { 
public: 
    CString() { } 
    CString(const char*); 
    CString(const char*, unsigned length); 
    CString(CStringBuffer* buffer) : m_buffer(buffer) { } 
    static CString newUninitialized(size_t length, char*& characterBuffer); 

    const char* data() const; 
//... 

} 

UTF8의 서명()입니다

class String { 
CString utf8() const; 
} 

고맙습니다.

+0

이 글꼴 라이브러리는 무엇입니까? C++에는 그런 것이 없습니다. 어쩌면'data()'에 의해 반환 된 타입을 포함 해 보라. 참고로'std :: string' /'std :: cout'을 사용하지 않는 이유는 무엇입니까? – GManNickG

+1

'.data()'메소드의 서명을 아는 것이 도움이 될 것입니다. – pioto

+0

family.string()은 CString 유형의 임시 객체를 반환합니까? –

답변

4

font.family().family().string().utf8().data() 체인의 일부가 임시 대상을 반환 중입니다. 첫 번째 printf에서는 printf이 반환 될 때까지 임시 개체가 범위를 벗어나지 않습니다. 두 번째 printf에서는 포인터 할당이 완료된 후 임시 요소가 삭제되어 포인터가 현재 유효하지 않습니다. "정의되지 않은 동작"에 대한 고전적인 예를 보았습니다.

이 문제를 해결하는 방법에는 두 가지가 있습니다. 임시 데이터가 삭제되기 전에 데이터 사본을 만들거나 임시 데이터를 참조하십시오. 클래스에 복사 연산자가있는 한 복사는 아마도 가장 쉽고 명확합니다. utf8() 임시 CString을 생성하는 가정이 반드시 null로 끝나는 문자열을 반환하지 않습니다 (그것이 표준 : : 문자열이라고 가정) data()

CString fontFamily = font.family().family().string().utf8(); 
printf ("drawText2 %s \n", fontFamily.data()); 
+0

이것은 잘못되었습니다. 임시 직원은 필요할 때까지 기다릴 수 있습니다. –

+0

임시에 대한 참조가 보장되지만 일부 내부 데이터 멤버에 대한 포인터는 보장됩니까? 나는 그렇게 생각하지 않는다. –

+0

따옴표 붙은 코드에는 포인터가 없습니다. "내부"포인터는 C++ 생성자/소멸자 메커니즘에 의해 처리됩니다. –

0

호출을 할 것이다. 당신은 거의 확실하게 c_str()을 원합니다.

1

utf8()에 의해 반환 된 임시에있는 포인터를 캐시하고 있습니다 (Mark와 Neil이 논쟁 한 것처럼). 범위가 utf8() 인 결과를 유지하려면 fontFamilyCString 또는 const CString &으로 변경해야합니다.

+0

감사합니다. 이렇게하면 문제가 해결됩니다. – michael

관련 문제