我无法将 cstring 转换为 int

Posted

技术标签:

【中文标题】我无法将 cstring 转换为 int【英文标题】:I can't convert cstring to int 【发布时间】:2012-07-30 19:11:48 【问题描述】:

我想从 cstring 中获取 int。 这是代码。


CStringArray paramArray;
paramArray.Add((LPCSTR)"5");
paramArray.Add((LPCTSTR)"151");

pvarArguments = new CComVariant[2];
pvarArguments[0] = (LPCTSTR)paramArray[1];

CString str;
str = (CStringA)pvarArguments[0];
int nlen = _wtoi(str.GetBuffer());

当我运行我的程序时,我总是得到值 0,我不明白为什么会这样。 请帮帮我。

【问题讨论】:

你确定paramArray[1] 持有你的CString 吗?从你发布的截图来看,我希望它是paramArray[0] 您是否定义了UNICODE?如果不是 LPCTSTR 只是一个 char*_wtoi 将不适合调用 哦,我很抱歉我的错误。 Codde一定是这样的。 paramArray.Add((LPCSTR)"5");; paramArray.add(((LPCSTR)"151"); 和ohher代码是一样的 @bTagTiger 请使用此新信息而不是评论来编辑您的问题。 【参考方案1】:

来自TFM(强调我的):

每个函数都返回通过解释输入产生的 int 值 字符作为数字。 atoi 和 _wtoi 的返回值为 0,如果 输入无法转换为该类型的值。

打印字符串或使用调试器检查它。字符串中可能存在无效(包括不可打印)字符。

【讨论】:

我建议打印或查看字符串每个字符的字节值,而不是依赖调试器或打印,因为正如您所说,在某些情况下可能不会显示无效字符。 【参考方案2】:

很难说你想做什么。你知道 C++ 数组是从 0 开始的,对吧?我问是因为这行代码:

pvarArguments[0] = (LPCTSTR)paramArray[1];

完全搞砸了。我不明白为什么在尝试索引 CStringArray 中等于元素计数的元素时它不会引发异常。您只能索引到 count-1 ==>>,在这种情况下为“0”。

你的 pvarArguments[0] 里面会有垃圾——我不知道为什么没有抛出异常。

如果你想从一个变体中得到一个不同的类型,你可以使用 VariantChangeType() 并且不要与 wcstoi 或 atoi 混淆。如果失败,它会给出一个错误代码,而不是只返回 0。如果你一心想要在 CString 上使用 wcstoi 或 atoi,请使用 _tstoi(),无论你是否定义了 UNICODE,它都有效。

【讨论】:

它是 C++。超出索引数组的范围,恶魔可能会飞出你的鼻子......或者你会崩溃......或者你会得到碰巧超过内存中数组的随机垃圾。 编辑: 糟糕,这是一个 MFC 集合。我不知道当你做一些愚蠢的事情时这些是否应该抛出异常。【参考方案3】:

CStringA 表示需要 atoi 而不是 _wtoi 的 ANSI 字符串类型。

我建议:

CString str(pvarArguments[0]);
int nlen = atoi(str.GetString());

GetBuffer() 并不理想,因为您必须记得稍后再使用ReleaseBuffer()

编辑:根据新信息,试试这个:

paramArray.Add(L"5");
paramArray.Add(L"151");

L macro 可以识别字符串 wchar_t。如果 L 不起作用,请尝试 _T。然后使用_wtoi_tstoi

【讨论】:

当我将此代码插入到我的项目中时,出现错误“无法将参数 1 从 const wchar_t * 转换为 const char*。所以我将函数名称更改为 _wtoi,而不是 atoi。但错误是一样。值为0。 @bTagTiger 您看到我对答案的修改了吗?L 宏对您有用吗?【参考方案4】:
CStringArray paramArray;
paramArray.Add(_T("5"));
paramArray.Add(_T("151"));

CComVariant *pvarArguments = new CComVariant[2];
pvarArguments[0] = (LPCTSTR)paramArray[1];

CString str;
str = pvarArguments[0].bstrVal;
int nlen = _ttoi(LPCTSTR(str));

【讨论】:

【参考方案5】:

根据上面的建议,这是为我编译的:

rs->GetFieldValueString(0).Left(1) == sBoroCode
    && (_ttoi(LPCTSTR(sLowHouseNo)) % 2) == (_ttoi(LPCTSTR(rs->GetFieldValueString(2))) % 2)

【讨论】:

以上是关于我无法将 cstring 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CEdit 类型的数据转换为 CString 类型的数据以及如何在消息框中显示? [复制]

将 CString 转换为浮点数组

如何将 CString 转换为 CByteArray?

如何将 CString 转换为字节

将 CString 数组转换为 System::String

将Cstring转换为BYTE