MyTetra Share
Делитесь знаниями!
Как правильно получить из QString строку const char *
Время создания: 21.04.2022 14:58
Текстовые метки: qt, строка, строки, преобразование, конвертировать, std, string, QString, char, c_str()
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Принципы написания кода
Запись: xintrea/mytetra_syncro/master/base/16505422944n6d9q1688/text.html на raw.github.com

Вопрос


Пишу такой код:



QString logFileName="/Directory/Logs/Log.txt";

qDebug() << "Log file name: " << logFileName;


const char *fileName = logFileName.toStdString().c_str();

printf("Const char * filename: ");

printf(fileName);

printf("\n");



И на экране получаю кракозябры вместо fileName:



Log file name: "/Directory/Logs/Log.txt"

Const char * filename: X���[



Я давно с сишными низкоуровневыми делами не работал.


Вопрос: почему кракозябры вместо строки?



Ответ


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


Другими словами: если приравнять значение переменной и использовать его:



const char *fileName = logFileName.toStdString().c_str();

printf(fileName);



то будет ошибка по вышеописанной причине.


А если использовать напрямую:



printf(logFileName.toStdString().c_str());



то ошибки не будет, потому что в C++ подстановка rvalue в функцию будет держать временные объекты на стеке до выхода из этой функции.


Так же в этом разделе:
 
MyTetra Share v.0.58
Яндекс индекс цитирования