[英]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
更改為CString
或const CString &
並將結果保留在范圍內的utf8()
中。
對data()
的調用(假設它在std :: string上調用)不一定返回以null結尾的字符串。 你幾乎肯定想要c_str()
,它被定義為這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.