C++ 格式在32位中崩溃
我有一个CString格式,它在SDK文件output.c行1629C++ 格式在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
中的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);