printf问题与const char *变量

时间:2010-03-05 21:42:40

标签: c++ 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 个答案:

答案 0 :(得分:4)

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 :(得分:1)

你正在缓存一个指针,它位于utf8()返回的临时中(正如Mark和Neil所说的那样)。您必须将fontFamily更改为CStringconst CString &才能将结果从utf8()保留在范围内。

答案 2 :(得分:0)

data()的调用(假设它在std :: string上调用)不一定返回以null结尾的字符串。你几乎肯定想要c_str(),这被定义为这样做。