C++ 格式在32位中崩溃

C++ 格式在32位中崩溃,c++,visual-c++,mfc,C++,Visual C++,Mfc,我有一个CString格式,它在SDK文件output.c行1629中的32位Unicode MFC Static/VS2013项目中导致崩溃,而(I--&&*pwch) 当我用64位编译它时,它工作没有任何问题,在32位中,当sValue3为空时它崩溃(但不是第一次,在第四次调用CString.Format时,sValue为空)糟糕!不允许在Format语句中使用CString对象。始终使用GetString CString sValue1 = tcszValue1; CString sVal

我有一个CString格式,它在SDK文件output.c行1629
中的32位Unicode MFC Static/VS2013项目中导致崩溃,而(I--&&*pwch)


当我用64位编译它时,它工作没有任何问题,在32位中,当sValue3为空时它崩溃(但不是第一次,在第四次调用CString.Format时,sValue为空)

糟糕!不允许在Format语句中使用CString对象。始终使用GetString

CString sValue1 = tcszValue1;
CString sValue2 = tcszValue2;
CString sValue3 = tcszValue3;

sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName, bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"), 
    nAppId, nId2, sValue1.GetString(), sValue2.GetString(), sValue3.GetString(), bValue);

您必须使用
%lld
格式说明符,而不是
%d
说明符


在32位世界中,
%d
需要一个32位整数。但您提供64位整数作为参数。因此,您会得到未定义的行为,因为
Format
将完全混淆参数。

首先,我有一个tcszValue,它是函数的一个LPCTSTR参数,然后我更改为CString,但它仍然崩溃OK,我尝试过GetString(),但它仍然崩溃。是和否,您是对的,您不应该在Format语句中使用CString对象,但是CString的设计方式使其能够工作,我已经简化了问题它不应该崩溃,tcszValue1、tcszValue2、tcszValue3、bValue的实际值是什么?尽量简化格式字符串,看看它何时停止崩溃,这可能会给你一个线索。你问题的最后一句需要编辑。什么是价值?sValue3?sValue3=L“SOFTWARE\\Classes\\CLSID”,sValue2=L“{0227cf80-1f01-11d6-a4e5-00e02921ea26}”,sValue3=L“好了,现在清楚了,请看下面的答案。现在你明白了,当你问问题时,所有细节都很重要。在编辑之前,没有人能猜到
nAppId
nId2
\uu int64
。谢谢!!这就是问题所在!,但是当我用64位编译它时,我可以用%lld吗?@MarioM实际上你应该用
%lld
,在64位版本上
%d
是偶然工作的。我以前用过%64d,但它只在64位exe中工作,而不是在32位。它不是
%I64d
而不是
%64d
%64d
就像
%d
,“64”这意味着此格式说明符的输出将用空格填充到64个字符。因此,
%64d
导致32位版本崩溃是正常的。
CString sValue1 = tcszValue1;
CString sValue2 = tcszValue2;
CString sValue3 = tcszValue3;

sSql.Format(_T("INSERT INTO Table (AppId, Id2, RegPath, RegKey, RegValueName, bRecurseDelete, RemoveIt) VALUES ('%d', '%d', '%s', '%s', '%s', '%d', 1)"), 
    nAppId, nId2, sValue1.GetString(), sValue2.GetString(), sValue3.GetString(), bValue);