转换(const char *)var出错

时间:2019-04-09 08:18:27

标签: c++ mfc char double c-strings

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

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 谁能帮助我获得正确的结果?

3 个答案:

答案 0 :(得分:1)

CString不是const char*要将TCHAR CString转换为ASCII,请使用CT2A宏-这还将允许您将字符串转换为UTF8(或任何其他Windows代码页):

// Convert using the local code page
CString str(_T("Hello, world!"));
CT2A ascii(str);
TRACE(_T("ASCII: %S\n"), ascii.m_psz);

// Convert to UTF8
CString str(_T("Some Unicode goodness"));
CT2A ascii(str, CP_UTF8);
TRACE(_T("UTF8: %S\n"), ascii.m_psz);

答案 1 :(得分:1)

这里的问题是,您对编译器撒谎,并且编译器信任您。我将假设使用嵌入式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是其CRT的Microsoft特定扩展。

请特别注意两件事:

  • 该代码使用CString变体,具有显式字符编码(CStringW)。始终明确显示您的字符串类型。这样可以帮助您阅读代码并在错误发生之前将其捕获(尽管原始代码中的所有C样式强制转换都可以完全消除该错误)。
  • 代码调用CString::GetString成员以检索指向不可变缓冲区的指针。通过不使用看起来像C样式的强制转换(而是使用运算符),这也使代码更易于阅读。

还要考虑定义_CSTRING_DISABLE_NARROW_WIDE_CONVERSION宏,以防止发生无意的字符集转换(例如CString str = "4.5";)。这也可以帮助您及早发现错误(除非您也使用C风格的强制类型转换将其消除)。

答案 2 :(得分:0)

使用scanf找到了解决方案

CString str="4.5" double var=0.0; _stscanf( str, _T("%lf"), &var );

这给出了正确的结果var=4.5 感谢大家的评论和帮助。