2009-10-13 37 views
8

我想使用atoi()將LPCSTR轉換爲整數,並驗證轉換是否成功發生我想要計算它生成的整數中的數字位數,原來的LPCSTR(它應該只包含整數)如何找到一個LPCSTR的長度

我很難找到一個很好的方法來計算LPCSTR的長度。到目前爲止唯一的辦法似乎只是計數,直到我得到一個'/ 0'

任何建議更好的方法?

謝謝

回答

11

這不是什麼strlen做的嗎?

+0

Doh!對不起,腦屁。必須有某種心理障礙,不記得這一個,從來沒有看到它在我的任何搜索 – 2009-10-13 18:21:55

+3

lstrlen()它是... – 2014-05-28 06:27:17

2

沒有。

這就是你如何找到c字符串的長度。你可以使用strlen,但它仍然需要沿着整個字符串並計算出'\0'之前的字符數。

8

您可以使用strtol並使用返回的endptr來檢查它是否是字符串的末尾(0字節)。

計數不一定準確。 「00」將導致0,但0有一個數字,原始字符串的長度爲2.

5

strlen()函數是您正在查找的內容。

使用範例:

size_t len = strlen(szNumber); 
2

談比光產生更多的熱量... :)停止使用「的atoi」,這將解決大部分的問題。 'atoi'是一種沒有實用價值的死亡功能。將字符串表示轉換爲數字的正確方法是從'strto ...'組('strtol','strtoul'等)中的函數。這些功能會將足夠的信息返回給您,以便立即確定是否發生轉換錯誤。

0

我願意做的事情有點不同 - 初始化字符串流與輸入,讀一個int,然後檢查流是否爲空:的

#include <sstream> 
#include <iostream> 

typedef char const *LPCSTR; 

template <class T> 
bool check_read(LPCSTR input, T &val) { 
    std::istringstream reader(input); 

    reader >> val; 
    char ch; 
    if (reader >> ch) { 
     std::cerr << "\nUnconverted character: " << ch << std::endl; 
     return false; 
    } 
    return true; 
} 

int main() { 
    LPCSTR inputs[] = {"12345", "54321a"}; 
    int a; 

    for (int i=0; i<2; i++) { 
     check_read(inputs[i], a); 
     std::cout << "Converted: " << a << std::endl; 
    } 
    return 0; 
} 

另一種合理的可能性是與strtol或一個其表兄弟。這些返回一個指向第一個未轉換字符的指針(如果有的話),所以它們直接告訴你什麼是和未被轉換。它們速度更快但通常比流更不靈活 - 例如,如果要讀取浮點數,上面的check_read將按原樣運行,但使用strtol的某些內容需要重寫。還有一種可能性,你可能會考慮Boost lexical_cast(打包方式稍有不同,但與上面的代碼很相似)。

1
LPCSTR lpText = "test"; 
long lTextLen = CString(lpText).GetLength(); 
14

要找到一個LPCTSTR的長度(在這種情況下,數字的位數),你應該使用lstrlen(),而不是strlen()。來源:MSDN

0

由於LPCSTR只是const char*(去宏觀後),strlen將罰款。

但是,如果您在顯式定義爲與LPCSTR輸入對應的Windows功能之後,則可以使用lstrlenA。我嚴重懷疑有沒有什麼實際的區別叫這個,並呼籲strlen雖然。