1

我想从 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,我不明白为什么会这样。请帮我。

4

5 回答 5

1

来自TFM(重点是我的):

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

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

于 2012-07-30T19:14:19.440 回答
0
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));
于 2012-08-01T04:23:37.480 回答
0

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

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

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

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

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

于 2012-07-30T22:22:28.773 回答
0

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

rs->GetFieldValueString(0).Left(1) == sBoroCode
    && (_ttoi(LPCTSTR(sLowHouseNo)) % 2) == (_ttoi(LPCTSTR(rs->GetFieldValueString(2))) % 2)
于 2015-03-05T23:25:50.613 回答
0

CStringA暗示不需要 ANSI 字符串atoi类型_wtoi

我建议:

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

GetBuffer()不理想,因为你必须记住以后ReleaseBuffer()

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

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

L 宏使字符串 wchar_t 知道。如果 L 不起作用,请尝试_T。然后使用_wtoior _tstoi

于 2012-07-30T19:46:17.683 回答