我无法将 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 类型的数据以及如何在消息框中显示? [复制]