gcc环境下,vswprintf问题,求高手指教!加急!!!

意吟 2013-02-25 02:03:47
源码:

int vprintf( std::wstring & strSrc, const wchar_t * pszArg, va_list argList )
{
int iAutoSize = 1024;
int iCopyCount = 0;
int iGrowthRate = 8;

std::wstring strTempBuff;

while ( true )
{
try
{
strTempBuff.resize( iAutoSize );
}
catch ( ... )
{
throw std::overflow_error( "String sprintf resize failed!" );
}

iCopyCount = vswprintf( ( wchar_t* )strTempBuff.data(), strTempBuff.length(), pszArg, argList );
if ( iCopyCount > 0 && iAutoSize > iCopyCount )
{
break;
}

//1k,8k,64k,512k,4m,32m,256m,-
iAutoSize *= iGrowthRate;
if ( iAutoSize < 0 )
{
throw std::overflow_error("String sprintf() failed, Autosize overflow!");
}
}

strTempBuff.resize( iCopyCount );
strSrc = strTempBuff;
return iCopyCount;
}

//格式化输出
int Format( std::wstring & strSrc, const wchar_t * pszArg, ... )
{
va_list argList;
va_start( argList, pszArg );

int iCopyCount = vprintf( strSrc, pszArg, argList );

va_end( argList );
return iCopyCount;
}


测试代码:

DECLARE_TEST_FUNC( TestUnicodeString_Format )
{
TEST_OUTPUT;

std::wstring a = L"zhang%s%sfei";
Format( a, a.c_str(), a.c_str(), a.c_str() );
std::wcout << L"Result:" << a << std::endl;
}



但是执行结果却是:
=========================================
TestUnicodeString_Format
Result:zhangzzfei


=========================================
可是我预期的结果是
zhangzhang%s%sfeizhang%s%sfeifei

=========================================
求解
...全文
207 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
要不 摒弃std::wstring 使用wchar_t *
healer_kx 2013-02-25
  • 打赏
  • 举报
回复
神棍,你不理智了,你只要Act as a Robot 就 OK了。
healer_kx 2013-02-25
  • 打赏
  • 举报
回复
当你真正想解决一个问题的时候真困难啊。。。都11楼了。。。
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
gdb命令layout regs用来显示源代码/反汇编和CPU寄存器窗口。
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
建议将下面代码带符号编译为Debug版。 然后 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
#include <stdio.h>
int main() {
	wchar_t ws[100];

	swprintf(ws,L"zhang%s%sfei", L"zhang%s%sfei", L"zhang%s%sfei" );
	wprintf(L"%s\n",ws);
    return 0;
}
//zhangzhang%s%sfeizhang%s%sfeifei
因为单步调试对应汇编时,我估计早晚要走到swprintf内部调用vswprintf处。此时你就可以参考人家swprintf是如何正确使用vswprintf了。
意吟 2013-02-25
  • 打赏
  • 举报
回复
这样,好像都是一样的啊~~~~
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
7楼呢?再试试
Format( b, L"zhang%s%sfei", L"zhang%s%sfei", L"zhang%s%sfei" );
意吟 2013-02-25
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
要不试试 C/C++ code?1Format( b, (wchar_t *)a.c_str(), (wchar_t *)a.c_str(), (wchar_t *)a.c_str() );
结果依然如此 (⊙o⊙)…
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
亦或
    std::wstring a = L"zhang%s%sfei";
    std::wstring b,c=a;
    Format( b, c.c_str(), a.c_str(), a.c_str() );
    std::wcout << L"Result:" << b << std::endl;
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
要不试试
Format( b, (wchar_t *)a.c_str(), (wchar_t *)a.c_str(), (wchar_t *)a.c_str() );
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
估计是a.c_str()的类型和Format对应参数的类型不匹配造成的。
意吟 2013-02-25
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
a根据自己的内容格式定义修改自己,玄!改为 C/C++ code?123 std::wstring a = L"zhang%s%sfei"; std::wstring b; Format( b, a.c_str(), a.c_str(), a.c_str() );再试试看。
===================================================== 还是不行的。输出的结果是一样的。
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
纠正上帖:
    std::wstring a = L"zhang%s%sfei";
    std::wstring b;
    Format( b, a.c_str(), a.c_str(), a.c_str() );
    std::wcout << L"Result:" << b << std::endl;
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
    std::wstring a = L"zhang%s%sfei";
    std::wstring b;
    Format( a, a.c_str(), a.c_str(), a.c_str() );
    std::wcout << L"Result:" << b << std::endl;
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
a根据自己的内容格式定义修改自己,玄!改为
  std::wstring a = L"zhang%s%sfei";
  std::wstring b;
  Format( b, a.c_str(), a.c_str(), a.c_str() );
再试试看。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧