繁体   English   中英

printf问题与const char *变量

[英]printf question with a const char* variable

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

谢谢。

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()返回的临时中(正如Mark和Neil所说的那样)。 您必须将fontFamily更改为CStringconst CString &并将结果保留在范围内的utf8()中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM