вопрос printf с переменной const char * - PullRequest
6 голосов
/ 06 марта 2010

Я застрял в проблеме с 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 ]

4 голосов
/ 06 марта 2010

Что-то в цепочке font.family().family().string().utf8().data() возвращает временный объект. В вашем первом printf временный объект не выходит из области видимости, пока не вернется printf. Во втором printf временный объект был уничтожен после назначения указателя, и теперь указатель недействителен. Вы видите классический пример «неопределенного поведения».

Есть два способа это исправить. Либо сделайте копию данных до уничтожения временного, либо сделайте ссылку на временный. Копия, вероятно, самая простая и понятная, если в классе есть оператор копирования. Предполагая, что utf8() генерирует временную CString, это будет

CString fontFamily = font.family().family().string().utf8();
printf ("drawText2 %s \n", fontFamily.data());
1 голос
/ 06 марта 2010

Вы кэшируете указатель, который находится во временном возвращаемом utf8() (о чем спорили Марк и Нил). Вам придется изменить fontFamily на CString или const CString &, чтобы сохранить результат от utf8() в области видимости.

0 голосов
/ 06 марта 2010

Вызов data() (при условии, что он вызывается в std :: string) не обязательно возвращает строку с нулевым символом в конце. Вы почти наверняка хотите c_str(), что определено для этого.

...