2013-10-23 18 views
1

C++ 프로그램의 텍스트를 Excel 파일로 출력하는 데 libXl을 사용하려고합니다.const char * C++에서 Excel 라이브러리로 올바르게 해석되지 않습니다.

문제는이 라이브러리 기능이오고있다 :

bool writeStr(int row, int col, const wchar_t* value, Format* format = 0) 

는 지정된 형식 셀에 문자열을 씁니다. 형식이 0과 같으면 형식이 무시됩니다. 문자열은 내부적으로 복사되며이 메서드를 호출 한 후 이 파괴 될 수 있습니다. 에러가 발생하면 false를 반환합니다. Book :: errorMessage()에서 오류 정보를 가져옵니다.

"Hello World"와 같은 문자열 리터럴로 입력하면 올바르게 표시됩니다. 그러나 const char * 유형의 변수로 입력을 시도하면 가비지가 표시됩니다.

다음은 제 코드입니다. MyCompany::companyQString입니다.

const char* companyName = MyCompany::company.toStdString().c_str(); 
sheet->writeStr(4, 0, companyName, companyFormat); 

아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있습니까? 이 라이브러리를 사용하여 변수 문자열을 표시하려면 어떻게해야합니까?

도움 주셔서 감사합니다. 여기

답변

2
const char* companyName = MyCompany::company.toStdString().c_str(); 

문제는() 버퍼 companyName 점은 c_str으로, 바로이 문장의 종료 후 무효가 있다는 것입니다 toStdString에 의해 반환되는 임시 표준 : : 문자열()가 파괴 될 때 무효가됩니다. 당신은 충분히 긴 표준 : : 문자열을 유지하여이 문제를 해결 할 수 있습니다

const std::string companyName = MyCompany::company.toStdString(); //survives until the end of the block 
sheet->writeStr(4, 0, companyName.c_str(), companyFormat); 

그래도 난 :: 표준을 통해 변환하지 문자열을 제안하는 대신 몇 가지 잘 정의 된 인코딩으로 변환 할 것입니다. 예를 들어, UTF-8의 경우 :

const QByteArray companyName = MyCompany::company.toUtf8(); 
sheet->writeStr(4, 0, companyName.constData(), companyFormat); 

(즉 const char* companyName = MyCompany::company.toUtf8().constData()은 위의 코드와 같은 문제가있는 것 참고).

+0

정말 고마워요! QByteArray는 매력처럼 작동합니다. –