gpt4 book ai didi

c++ - __int64 到 CString 返回错误值 - C++ MFC

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

我想将一个 __int64 变量转换成一个 CString。代码就是这样

__int64 i64TotalGB;
CString totalSpace;
i64TotalGB = 150;
printf("disk space: %I64d GB\n", i64TotalGB);
totalSpace.Format(_T("%I64d", i64TotalGB));
printf("totalSpace contains: %s", totalSpace);

第一个 printf 打印

"disk space: 150GB"

这是正确的,但是第二个 printf 打印出随机的高数字,例如

“总空间包含:298070026817519929”

我也尝试过使用 INT64 变量而不是 __int64 变量,但结果是一样的。这可能是什么原因造成的?

最佳答案

这里:

totalSpace.Format(_T("%I64d", i64TotalGB));

您正在将 i64TotalGB 作为参数传递给 _T() macro而不是将其作为第二个参数传递给 Format()

试试这个:

totalSpace.Format(_T("%I64d"), i64TotalGB);

话虽如此,由于 MS 在字符编码方面的困惑 (ha),在这里使用 _T 并不是正确的做法,因为 CString 组成TCHAR 而不是 _TCHAR。所以考虑到这一点,不妨使用 TEXT() 而不是 T(),因为它依赖于 UNICODE 而不是 _UNICODE:

totalSpace.Format(TEXT("%I64d"), i64TotalGB);

此外,这一行是错误的,因为它试图将 ATL CString 作为 char*(又名 C 风格字符串)传递:

printf("totalSpace contains: %s", totalSpace);

编译器为此发出警告:

warning C4477: 'printf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'ATL::CString'

虽然 CString 的结构实际上与您传递它的方式兼容,但这在形式上仍然是未定义的行为。使用 CString::GetString() 来防范它:

printf("totalSpace contains: %ls", totalSpace.GetString());

请注意 %ls 在我的配置下 totalSpace.GetString() 返回了一个 const wchar_t*。然而,作为"printf does not currently support output into a UNICODE stream." ,此行的正确版本,将支持当前 code page 之外的字符, 是按以下方式调用 wprintf():

wprintf("totalSpace contains: %s", totalSpace.GetString());

说了这么多,这里有一个一般性的建议,不管问题背后的直接问题是什么。现在更好的做法完全略有不同,我引用了@IInspectable 令人尊敬的回答,他说“通用文本映射在 2 年前是相关的”

还有什么选择?在没有足够充分理由的情况下,请尝试明确使用 CStringW ( A Unicode character type string with CRT support )。更喜欢 L character literal在古老的data/text mappings取决于常量_UNICODE_MBCS 是否已在您的程序中定义。相反,更好的做法是使用所有 API 和语言库调用的宽字符版本,例如 wprintf()而不是 printf()

关于c++ - __int64 到 CString 返回错误值 - C++ MFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494832/

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