如何将CString转换为long? VC ++

时间:2015-06-10 04:53:01

标签: c++ visual-c++ mfc

如何在vc ++中将CString转换为long。我使用过atol但是它输了错误。

long ldata = atol(str);

错误否从CString到const char *的适当转换。

3 个答案:

答案 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(CStringA(xxx))或_ttol

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)建议。

Example

原因

转换为CStringA应该适用于16位宽或8位宽的字符串,因此您不必使用#ifdef UNICODE这样的可怕的编译器指令来污染软件。

在可用的系统上,您可以使用_ttol,就像_atol_wtol,但是(如上述解决方案一样)将有效,无论编译器指令UNICODE是否处于活动状态。

请注意,还有诸如_atol_l之类的其他功能也可以使用语言环境定义来工作,如果您想从诸如“ 400.456 Deutsch Marks”或“ 400,456 pounds sterling”之类的字符串中读取整数,该功能可能会很有用。