我想使用atoi()將LPCSTR轉換爲整數,並驗證轉換是否成功發生我想要計算它生成的整數中的數字位數,原來的LPCSTR(它應該只包含整數)如何找到一個LPCSTR的長度
我很難找到一個很好的方法來計算LPCSTR的長度。到目前爲止唯一的辦法似乎只是計數,直到我得到一個'/ 0'
任何建議更好的方法?
謝謝
我想使用atoi()將LPCSTR轉換爲整數,並驗證轉換是否成功發生我想要計算它生成的整數中的數字位數,原來的LPCSTR(它應該只包含整數)如何找到一個LPCSTR的長度
我很難找到一個很好的方法來計算LPCSTR的長度。到目前爲止唯一的辦法似乎只是計數,直到我得到一個'/ 0'
任何建議更好的方法?
謝謝
這不是什麼strlen做的嗎?
沒有。
這就是你如何找到c字符串的長度。你可以使用strlen
,但它仍然需要沿着整個字符串並計算出'\0'
之前的字符數。
您可以使用strtol
並使用返回的endptr
來檢查它是否是字符串的末尾(0字節)。
計數不一定準確。 「00」將導致0,但0有一個數字,原始字符串的長度爲2.
談比光產生更多的熱量... :)停止使用「的atoi」,這將解決大部分的問題。 'atoi'是一種沒有實用價值的死亡功能。將字符串表示轉換爲數字的正確方法是從'strto ...'組('strtol','strtoul'等)中的函數。這些功能會將足夠的信息返回給您,以便立即確定是否發生轉換錯誤。
我願意做的事情有點不同 - 初始化字符串流與輸入,讀一個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(打包方式稍有不同,但與上面的代碼很相似)。
LPCSTR lpText = "test";
long lTextLen = CString(lpText).GetLength();
要找到一個LPCTSTR
的長度(在這種情況下,數字的位數),你應該使用lstrlen()
,而不是strlen()
。來源:MSDN
由於LPCSTR
只是const char*
(去宏觀後),strlen
將罰款。
但是,如果您在顯式定義爲與LPCSTR
輸入對應的Windows功能之後,則可以使用lstrlenA
。我嚴重懷疑有沒有什麼實際的區別叫這個,並呼籲strlen
雖然。
Doh!對不起,腦屁。必須有某種心理障礙,不記得這一個,從來沒有看到它在我的任何搜索 – 2009-10-13 18:21:55
lstrlen()它是... – 2014-05-28 06:27:17