gpt4 book ai didi

c++ - sprintf 如何与 CString 和 std::string 一起工作

转载 作者:可可西里 更新时间:2023-11-01 18:20:10 25 4
gpt4 key购买 nike

CString s = "test";
std::string ss = "test";

char z[100];
sprintf(z, "%s", ss.c_str()); // z = "test" : OK

char z2[100];
sprintf(z2, "%s", ss); // z2 = "(null)" : OK. undefined behavior is expected

char z3[100];
sprintf(z3, "%s", s); // z3 = "test" : How is this possible ?!

谁能解释一下 CString 如何与 sprintf 一起正常工作?

最佳答案

之所以有效,是因为 CString 类的第一个元素是指向 char 数组的指针。实际上,CString 中唯一的字段是一个指向字符串数组的指针。此类使用一些技巧来隐藏内部数据(如字符串长度、保留缓冲区大小等),方法是分配一个大缓冲区,然后留下唯一指向 char 数组的类指针,以获取那些内部数据字段,它将此指针移动已知偏移量。

你应该做的是调用 s.GetBuffer(0);或 (LPCTSTR);但将其用作

sprintf(z2, "%s", ss);

MFC 创建者的设计是允许的,当然它可以在 Windows 下工作,在其他平台上可能会崩溃。

[评论后编辑]

如果不是像 (LPCTSTR)s 这样的 C 风格转换,你的代码会更安全您将使用 C++ 转换:static_cast<LPCTSTR>(s); .但是很快你就会发现你的代码因为所有这些 static_cast-s 而变得丑陋,尤其是当你的 sprintf-s 有很多参数的时候。据我所记得(并且在我看来)设计,C++ 风格的强制转换旨在让您重新考虑您的设计以完全不使用强制转换。在您的情况下,您应该使用 std::wstringstream 而不是使用 sprintf (假设您使用 UNICODE 构建):

#include<sstream>

std::wostream & operator<< (std::wostream &out, CString const &s) {
out << s.GetString();
return out;
}

int main(){
CString s = _T("test");
std::wstringstream ss;
ss << s; // no cast required, no UB here
std::wcout << ss.str();
return 0;
}

关于c++ - sprintf 如何与 CString 和 std::string 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22036843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com