LINUX.ORG.RU

Что-то не могу получить из QString строку const char *

 const char, , , ,


0

1

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

    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, но затем временный объект удаляется, и начинается выполнение следующей команды.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ага, тоже на такое натыкался. И почему toStdString, а не str.toUtf8().constData()?

ox55ff ★★★★★
()
Ответ на: комментарий от Xintrea
printf(logFileName.toStdString().c_str());

или

printf(qPrintable(logFileName));

Что более правильно, поскольку будет использована кодировка под местную локаль.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

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

Вот не надо так делать.

printf("%s", logFileName.toStdString().c_str()) 

избавляет необходимости валидации logFileName, или лучше сразу

printf("Const char * filename: %s\n", 
       logFileName.toStdString().c_str());
Begemoth ★★★★★
()
Ответ на: комментарий от Xintrea

This is equivalent to str.toLocal8Bit().constData().

Выведет если настроить там кодировку windows-1251 (chcp)

Begemoth ★★★★★
()
Ответ на: комментарий от Xintrea

Походу

Вот только не походу, а именно так и есть. Тут надо смотреть тип результат функции:

std::string QString::toStdString() const
Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Вот не надо так делать.

Ты о том, что там nullptr можеть вернуться? Да, согласен. Я просто хотел показать, что в C++ подстановка rvalue в функцию будет держать временные объекты на стеке до выхода из этой функции.

Dendy ★★★★★
()

А зачем printf с Qt? Пишется какая-то обертка для C?

peregrine ★★★★★
()

В подобных случаях можно использовать QString::toLocal8Bit().data() - по умолчанию он выдаст текст, закодированный в системной локали,но это можно поменять, задав кодек по умолчанию.

Но тебе тут правильно задавали вопрос, зачем такое смешивание. Ты пишешь консольное приложение на QtCore? В этом случае я бы всё равно выводил через потоки, а не через printf().

hobbit ★★★★★
()

printf(fileName);

А потом тебе сунут файл с именем «%s%s%s%s%s%s%s».

anonymous
()
Ответ на: комментарий от Begemoth

Не говоря уж о том, что можно сэкономить на парсинге строки. Неизвестно, какого объёма там эти строки и как часто их надо будет печатать.

meliafaro ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.