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までスコープから外れません。printf2番目printfの例では、ポインターの割り当てが行われた後に一時的なものが破棄され、ポインターが無効になりました。あなたは「未定義動作」の典型的な例を見ています。

これを修正するには2つの方法があります。一時が破棄される前にデータのコピーを作成するか、一時への参照を作成します。クラスにコピー演算子がある限り、コピーはおそらく最も簡単で明確です。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のいずれかに変更する必要があります。CStringconst CString &utf8()

于 2010-03-05T22:19:28.100 に答える
0

への呼び出しdata()(std::string で呼び出されると仮定) は、必ずしも null で終わる文字列を返すとは限りません。ほぼ確実に が必要c_str()であり、そのように定義されています。

于 2010-03-05T21:51:02.457 に答える