簡體   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