const char * неправильно интерпретируется C ++ в библиотеку Excel

Я пытаюсь использовать libXl для вывода текста из программы на C ++ в файл Excel.

Проблема идет с этой библиотечной функцией:

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

Записывает строку в ячейку с указанным форматом. Если формат равен 0
тогда формат игнорируется. Строка копируется внутри и может быть
уничтожено после вызова этого метода. Возвращает false, если произошла ошибка. Получить
информация об ошибке с помощью Book :: errorMessage ().

Если я даю ввод в виде строкового литерала, например «Hello World», он отображается правильно. Однако, если я попытаюсь ввести input как переменную типа const char *, она отобразит мусор.

Ниже мой код. MyCompany::company это QString,

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

Кто-нибудь может сказать мне, что происходит? Как я могу отобразить переменную строку с помощью этой библиотеки?

Спасибо за вашу помощь.

1

Решение

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

Проблема здесь в том, что буфер companyName указывает на становится недействительным сразу после окончания этого оператора, так как c_str () становится недействительным, когда временная std :: string, возвращаемая toStdString () уничтожается. Вы можете решить эту проблему, сохранив std :: string достаточно долго:

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

Я бы посоветовал не конвертировать через std :: string, а вместо этого конвертировать в определенную кодировку. Например UTF-8:

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

(Обратите внимание, что const char* companyName = MyCompany::company.toUtf8().constData() будет иметь ту же проблему, что и ваш код выше).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]