如何在vc ++中将CString转换为long。我使用过atol但是它输了错误。
long ldata = atol(str);
错误否从CString到const char *的适当转换。
答案 0 :(得分:4)
如前所述,您使用的是Unicode。您必须将Unicode用于其他功能:
long ldata = _wtol(str);
CString
声明中的某个地方是这样的:
#ifdef UNICODE
#define CString CStringW
#else
#define CString CStringA
#endif
当项目编译为Unicode时,CString
变为宽字符CStringW
,因此您必须使用atol
的宽字符版本_wtol
并且彼此相同字符串函数。
答案 1 :(得分:0)
来自https://msdn.microsoft.com/en-us/library/awkwbzyc.aspx
"要将CString对象用作C风格的字符串,请将对象强制转换为LPCTSTR。"
所以str
应该像这样投放到LPCTSTR
:
atol((LPCTSTR)str);
答案 2 :(得分:0)
atol((LPCTSTR)str
幸运地没有编译,但是如果编译成功,可能会给出错误的结果,请参见下文。
有人做出了一个可怕的决定,将Windows Unicode字符存储为UTF16在CString中,这引起了CStringW和CStringA的恐怖。 (16位仍然不足以存储所有Unicode字符,请参见bat示例。)
如果将CString转换为CStringA(然后将其转换为以N结尾的字符串指针,如果您认为这比希望编译器会更好的话),那么atol
应该具有所需的ASCII字符串。
软件示例中最后一个选项没有提供1000的原因是CStringW为1存储了两个字节(每个后续字符又存储了两个字节),ASCII'1'和一个空字节。只需将指针转换为ASCII空终止的字符串指针,就可以使该字符串看起来像一个空终止的字符串,其中只有1。因此,请远离任何(LPCTSTR)建议。
转换为CStringA应该适用于16位宽或8位宽的字符串,因此您不必使用#ifdef UNICODE
这样的可怕的编译器指令来污染软件。
在可用的系统上,您可以使用_ttol
,就像_atol
和_wtol
,但是(如上述解决方案一样)将有效,无论编译器指令UNICODE
是否处于活动状态。
请注意,还有诸如_atol_l
之类的其他功能也可以使用语言环境定义来工作,如果您想从诸如“ 400.456 Deutsch Marks”或“ 400,456 pounds sterling”之类的字符串中读取整数,该功能可能会很有用。