在嵌入式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
谁能帮助我获得正确的结果?
答案 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_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
感谢大家的评论和帮助。