2012-07-30 106 views
1

我想从cstring获取int。 这是代码。我无法将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

你确定'的ParamArray [1]'抱着你'CString'?从你张贴的剪辑中,我期望它是'paramArray [0]'。 – Chad 2012-07-30 19:14:07

+1

你有没有定义'UNICODE'?如果不是'LPCTSTR'就是'char *','_wtoi'不适合拨打 – YePhIcK 2012-07-30 19:16:44

+0

哦,我很抱歉我的错误。 Codde必须是这样的。 paramArray.Add((LPCSTR) “5”);; paramArray.add(((LPCSTR)“151”);以及其他代码相同 – bTagTiger 2012-07-31 02:39:18

回答

1

TFM(重点煤矿):

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

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

+0

我建议打印或查看每个字符的字节值而不是依赖于调试器或打印,因为正如你所说在某些​​情况下无效字符可能不会显示。 – NominSim 2012-07-30 19:15:56

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 macro使字符串wchar_t的认识。如果L不起作用,请尝试使用_T。然后使用_wtoi_tstoi

+0

当我将此代码插入到我的项目中时,会发生错误:“无法将常量wchar_t中的parameter1转换* to const char *。所以我把函数名改为_wtoi,而不是atoi,但是错误是一样的,值为0。 – bTagTiger 2012-07-31 02:46:42

+0

@bTagTiger您是否看到我的编辑符合我的回答,并为您执行了'L'宏? – acraig5075 2012-08-01 06:17:50

0

即使你正在尝试做什么也很难说。你知道C++数组是基于0的,对吗?我问,因为这行代码:

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

是完全搞砸了。我不明白为什么它不试图在CStringArray中索引等于元素数量的元素时抛出异常。您只能索引count-1 == >>,在本例中为“0”。

你的pvarArguments [0]将会有垃圾 - 我不知道为什么不抛出异常。

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

+0

它是C++。超出索引数组的范围,恶魔可能会飞出你的鼻子......否则你会崩溃......或者你会得到随机垃圾,它恰好在内存中经过数组。 ops,这是一个MFC集合。当你做一些愚蠢的事情时,我不知道这些是否应该抛出异常。 – LnxPrgr3 2012-07-30 22:26:52

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)); 
0

按照上述建议,这个编译对我来说:

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