如何将CString传递给格式字符串%s?

Ben*_*min 13 c++ windows string type-conversion string-formatting

class MyString
{
public:
    MyString(const std::wstring& s2)
    {
        s = s2;
    }

    operator LPCWSTR() const
    {
        return s.c_str();
    }
private:
    std::wstring s;
};

int _tmain(int argc, _TCHAR* argv[])
{
    MyString s = L"MyString";
    CStringW cstring = L"CString";
    wprintf(L"%s\n", (LPCWSTR)cstring); // Okay. Becase it has an operator LPCWSTR()
    wprintf(L"%s\n", cstring); // Okay, fine. But how?        
    wprintf(L"%s\n", (LPCWSTR)s); // Okay. fine.
    wprintf(L"%s\n", s); // Doesn't work. Why? It prints gabage string like "?."
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何将CString传递给格式字符串%s?

顺便一句,MSDN说(这很奇怪)

在变量参数函数中使用CString对象
将CString显式地转换为LPCTSTR字符串,如下所示:

CString kindOfFruit = "bananas";
int      howmany = 25;
printf( "You have %d %s\n", howmany, (LPCTSTR)kindOfFruit ); 
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 13

CString是专门设计的,它只包含一个指向缓冲区类中字符串数据的指针.当通过值传递给printf时,当在格式字符串中看到"%s"时,它将被视为指针.

它最初只是偶然使用printf,但后来被保留为类接口的一部分.


这篇文章基于MS文档很久以来已经退休,所以我无法链接到他们的承诺,他们将继续使这项工作.

但是,在添加更多downvotes之前,请阅读分享我以前的知识的人的博文:

老大哥帮助你

  • 我仍然不知道如何使用`printf`打印它.你能展示一个例子吗? (3认同)

Pup*_*ppy 6

    wprintf(L"%s\n", (LPCWSTR)cstring); // Okay. It's been cast to a const wchar_t*.
    wprintf(L"%s\n", cstring); // UNDEFINED BEHAVIOUR
    wprintf(L"%s\n", (LPCWSTR)s); // Okay, it's a const wchar_t*.
    wprintf(L"%s\n", s); // UNDEFINED BEHAVIOUR
Run Code Online (Sandbox Code Playgroud)

只有你可以通过这个功能的事情%sconst wchar_t*.其他任何东西都是未定义的行为.传递CString恰好可以正常工作.

有一个原因iostream是用C++开发的,这是因为这些变量参数函数非常不安全,并且永远不会被使用.哦,CString也是一个很大的罪恶,有很多理由,坚持std::wstringcout/ wcout无论你在哪里.

  • CString的未定义行为实际上是特定于实现的行为.Microsoft支持此用法. (3认同)
  • @BoP它是C++中未定义的行为,因为它在C的标准库`printf`文档中是未定义的行为.微软给它一个意义(我还没有看到官方文档,但是)很好,但代码仍然不可移植. (2认同)
  • @BoP我只想注意它是未定义的行为.不确定的人可能会将您的评论视为"不,这不是未定义的行为.但它是实施定义的".哪个错了.我知道你可能想表达什么. (2认同)