6

我陷入了 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;
}

谢谢你。

4

3 回答 3

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());
于 2010-03-05T21:46:33.337 回答
1

您正在缓存一个驻留在临时返回的指针utf8()(正如 Mark 和 Neil 所争论的那样)。您必须更改fontFamily为 aCStringconst CString &将结果保持utf8()在范围内。

于 2010-03-05T22:19:28.100 回答
0

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

于 2010-03-05T21:51:02.457 回答