【问题标题】:printf question with a const char* variable带有 const char* 变量的 printf 问题
【发布时间】:2010-03-05 21:42:40
【问题描述】:

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

谢谢。

【问题讨论】:

  • 这个字体库是什么? C++ 没有这样的东西。也许尝试包括data() 返回的类型。附带说明一下,有什么理由不使用std::string/std::cout
  • 了解.data() 方法的签名会有所帮助。
  • 而family.string()返回一个CString类型的临时对象?
  • 得墨忒耳法则怎么了?
  • 我们很可能需要有关 data() 的更多详细信息。你能发布完整的实现吗?

标签: c++ printf const-char


【解决方案1】:

font.family().family().string().utf8().data() 链中的某些内容正在返回一个临时对象。在您的第一个printf 中,在printf 返回之前,临时对象不会超出范围。在第二个printf 中,在进行指针分配后临时已被销毁,并且指针现在无效。您看到的是“未定义行为”的经典示例。

有两种方法可以解决此问题。在临时文件被销毁之前制作数据副本,或者对临时文件进行引用。只要类有一个复制操作符,复制可能是最简单和最清晰的。假设utf8() 生成一个临时的CString,这将是

CString fontFamily = font.family().family().string().utf8();
printf ("drawText2 %s \n", fontFamily.data());

【讨论】:

  • 这是错误的。只要需要(或多或少),临时工就可以在附近闲逛。
  • 保证了对临时的引用,但是指向某个内部数据成员的指针?我认为不会。
  • 引用的代码中没有指针。 “内部”指针将由 c++ 构造函数/析构函数机制处理。
  • @Neil Butterworth:你在说什么?任何中间调用都完全有可能返回一个临时的。这个临时的将在fontFamily 初始化后立即被杀死(这让fontFamily 悬而未决)。语言中没有任何保证可以延长临时的生命周期。你从哪里得到这个想法的? C++ 中唯一听起来相似的东西是专门保证引用的,但我们在这个例子中没有引用。
  • @Neil Butterworth:嗯,这个问题的主题是(正如 OP 明确表达的那样):为什么 second printf 不能按预期工作,而第一个是。
【解决方案2】:

您正在缓存一个指针,该指针位于 utf8() 返回的临时变量中(正如 Mark 和 Neil 所争论的那样)。您必须将 fontFamily 更改为 CStringconst CString & 以保持 utf8() 的结果在范围内。

【讨论】:

  • 谢谢。这解决了问题。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2018-07-30
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多