2012-07-30 97 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)