gpt4 book ai didi

c++ - 转换(const char*)var出错

转载 作者:行者123 更新时间:2023-11-30 03:17:21 25 4
gpt4 key购买 nike

我需要在仅支持旧式 C++ 的嵌入式 Visual C++ 中将 CString 转换为 double。我正在使用以下代码

CString str = "4.5";
double var = atof( (const char*) (LPCTSTR) str )

结果是 var=4.0,所以我丢失了小数位。我又做了一个测试

LPCTSTR str = "4.5";
const char* var = (const char*) str

再次得到结果 var=4.0谁能帮我得到正确的结果?

最佳答案

这里的问题是,你在欺骗编译器,而编译器信任你。使用嵌入式 Visual C++ 我假设您的目标是 Windows CE。 Windows CE 仅公开 Unicode API 表面,因此您的项目很可能设置为使用 Unicode(UTF-16 LE 编码)。

在这种情况下,CString 扩展为 CStringW,它将代码单元存储为 wchar_t。在执行 (const char*) (LPCTSTR) str 时,您将从 wchar_t const* 转换为 char const*。给定输入,第一个字节的值为 52(字符 4 的 ASCII 编码)。第二个字节的值为 0。这被解释为 C 风格字符串的终止符。换句话说,您将字符串 "4" 传递给对 atof 的调用。自然地,您会得到值 4.0 作为结果。

要修复代码,请使用如下内容:

CStringW str = L"4.5";
double var = _wtof( str.GetString() );

_wtof是 Microsoft 对其 CRT 的特定扩展。

特别注意两点:

  • 该代码使用具有显式 字符编码的CString 变体(CStringW)。始终明确说明您的字符串类型。这有助于阅读您的代码并在错误发生之前发现错误(尽管原始代码中所有那些 C 风格的强制转换完全无法做到这一点)。
  • 代码调用 CString::GetString成员检索指向不可变缓冲区的指针。这也使代码更易于阅读,因为它不使用看起来像 C 风格的转换(而是一个运算符)。

同时考虑定义 _CSTRING_DISABLE_NARROW_WIDE_CONVERSION宏以防止发生无意的字符集转换(例如 CString str = "4.5";)。这也有助于您尽早发现错误(除非您也使用 C 风格的转换来解决错误)。

关于c++ - 转换(const char*)var出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55588114/

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