Вопрос printf с переменной const char*
Я застрял в проблеме printf. Я был бы признателен, если бы я мог получить некоторую помощь здесь: В приведенном ниже коде я вижу, как семейство шрифтов корректно смещается в первом printf (), но если я установлю его в переменную, я получу только пустую строку. Как я могу положить его в переменную и иметь правильные значения? Я просто не хочу везде печатать "font.family (). Family (). String (). Utf8(). Data ()").
Я сделал это тем же способом:
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);
}
И подпись 'data ()'
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;
}
Спасибо.
3 ответа
Что-то в цепочке font.family().family().string().utf8().data()
возвращает временный объект. В вашем первом printf
временный объект не выходит из области видимости до printf
возвращается. Во-вторых printf
, временный объект был уничтожен после назначения указателя, и указатель теперь недействителен. Вы видите классический пример "неопределенного поведения".
Есть два способа это исправить. Либо сделайте копию данных до уничтожения временного, либо сделайте ссылку на временное. Копия, вероятно, самая простая и понятная, если в классе есть оператор копирования. При условии, что utf8()
генерирует временный CString
, это было бы
CString fontFamily = font.family().family().string().utf8();
printf ("drawText2 %s \n", fontFamily.data());
Вы кэшируете указатель, который находится во временном возвращаемом utf8()
(как спорили Марк и Нил). Вам придется изменить fontFamily
либо CString
или же const CString &
сохранить результат от utf8()
в рамках.
Призыв к data()
(при условии, что он вызывается в std::string) не обязательно возвращает строку с нулевым символом в конце. Вы почти наверняка хотите c_str()
, который определен для этого.