CA2W格式化多个时需要加强制转换,CDuiString格式化也需强转

本文详细探讨了在使用CString进行字符串格式化时遇到的问题,特别是涉及CA2W对象的多重格式化场景。文章揭示了乱码产生的根本原因——内部变量地址计算错误,并提供了正确的使用方式和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        CString str;
	str.Format(L"%s", CM2W(ss.data()));
	str.Format(L"%s, %s", (LPCTSTR)CM2W(ss.data()), (LPCTSTR)CM2W("asdfg"));
	str.Format(L"%s", (LPCTSTR)CA2W("trew"));			//正确
	str.Format(L"%s, %s", CA2W("trew"), CA2W("12345"));	//错误
	str.Format(L"%s, %s", (LPCTSTR)CA2W("trew"), (LPCTSTR)CA2W("12345")); //正确
	str.Format(L"%s, %s", CA2W("trew").m_psz, CA2W("12345").m_psz);		 //正确
	str.Format(L"%s, %s", CString(L"trew"), CString(L"12345"));			 //正确
	str.Format(L"%s, %s", CDuiString(L"trew"), CDuiString(L"12345"));	 //正确

	CDuiString sd1 = L"dafsdf", sd2 = L"8955";
	str.Format(L"%s, %s", sd1, sd2);		//错误
	
	stringstream sst;
	sst << CW2A(L"zxcv") << 88 << CW2A(L"bnm");	//正确

在格式化字符串时,如果用到了CA2W,发现当格式化多个时需要加强制类型转换,否则格式化出来的是乱码,开始以为是后面的CA2W对象提前析构的问题,后来进入格式函数内部测试,发现是由于内部变量的地址计算错误导致的,主要原因就是该类的成员中多了一个 char m_szBuffer[t_nBufferLength];,这个在可变参数格式化时,排在后面的就会地址计算错误。

测试函数:   

int CDuiString::Format(LPCTSTR pstrFormat, ...)
    {
        int nRet;
        va_list Args;

        va_start(Args, pstrFormat);
        TCHAR *p1 =  va_arg(Args, TCHAR*);
        nRet = InnerFormat(pstrFormat, Args);
        va_end(Args);

        return nRet;

    }

 

INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:

#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

VA_END宏,清空va_list可变参数列表:

#define va_end(ap) ( ap = (va_list)0 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值