微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将CString传递给格式string%s?

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"%sn",(LPCWSTR)cstring); // Okay. Becase it has an operator LPCWstr() wprintf(L"%sn",cstring); // Okay,fine. But how? wprintf(L"%sn",(LPCWSTR)s); // Okay. fine. wprintf(L"%sn",s); // Doesn't work. Why? It prints gabage string like "?." return 0; }

如何将CString传递给格式string%s?

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

在variables参数函数中使用CString对象

将CString显式转换为LPCTSTRstring,如下所示:

CString kindOfFruit = "bananas"; int howmany = 25; printf( "You have %d %sn",howmany,(LPCTSTR)kindOfFruit );

如何使用Delphi获取文件扩展名关联的程序的名称

Nginx为dynamic生成文件设置错误的Content-Type头

我可以假设长整型的大小总是4个字节?

Windows窗体 – validationDataGridViewinput

“整型”是什么意思?

我怎样才能告诉如果一个文件是使用PHP的文本?

是否有一个相当于Unix文件命令的Java库

plain C:用fopen()打开一个目录

在Windows中识别文件types

我如何将BOOL转换为BOOL?

CString是专门设计的,它只包含一个指向缓冲区类中的字符串数据的指针。 它通过值传递给printf,然后在格式化字符串中看到“%s”时将其作为指针处理。

它最初只是碰巧和printf一起工作,但后来被保留为类接口的一部分。

wprintf(L"%sn",(LPCWSTR)cstring); // Okay. It's been cast to a const wchar_t*. wprintf(L"%sn",cstring); // UNDEFINED BEHAVIoUR wprintf(L"%sn",(LPCWSTR)s); // Okay,it's a const wchar_t*. wprintf(L"%sn",s); // UNDEFINED BEHAVIoUR

你可以传给这个函数的唯一的东西是const wchar_t* 。 任何其他的是未定义的行为。 传递CString只是恰好工作。

一个原因是iostream是用C ++开发的,这是因为这些可变参数函数是非常不安全的,所以永远不会被使用。 哦,CString也是一个罪恶,因为很多原因,坚持std::wstring和cout / wcout无论你在哪里。

CString有一个指针作为第一个成员:

class CStringA { char* m_pString; };

虽然它不是char* (即使是ANSI CString),它也差不多是一样的。 当你将CString对象传给任何printf函数族(包括你的自定义实现,如果有的话),你传递的是CString对象(在堆栈上)。 %s解析导致它读取,就好像它是一个指针 – 在这种情况下(这是第一个字节的数据是m_pString ),这是一个有效的指针。

一般来说这是不确定的行为。 根据这篇文章, Visual C ++只是调用从CString到POD类型的转换来覆盖你 – 这是允许的未定义行为的实现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐