我不需要知道int是什麼,我只需要知道它是否是一個十進制表示中的正整數表示,不帶前導0。如何檢查字符串是否表示正的非零整數?
這將被要求大量的記錄,所以我希望它是儘可能便宜的檢查。
預期的行爲是系統永遠不應該被傳遞一些無法驗證的東西(因爲它通常是通過int轉換爲字符串進行存儲的),所以這只是最終的安全檢查,以確保沒有任何奇怪的事情發生。
我不需要知道int是什麼,我只需要知道它是否是一個十進制表示中的正整數表示,不帶前導0。如何檢查字符串是否表示正的非零整數?
這將被要求大量的記錄,所以我希望它是儘可能便宜的檢查。
預期的行爲是系統永遠不應該被傳遞一些無法驗證的東西(因爲它通常是通過int轉換爲字符串進行存儲的),所以這只是最終的安全檢查,以確保沒有任何奇怪的事情發生。
雖然你實際上可以經歷實際將其轉換爲int的過程,但我的假設是,你真正想知道的是它中的所有字符是否都是數字?
不幸的是,即使這樣,沒有其他選擇,只能線性運行字符串,儘管這應該比首先轉換爲整數更快。
使用STL,你可以使用std ::發現和:: ISDIGIT和std :: NOT1
template<typename FwdIter>
bool all_digits(FwdIter start, FwdIter end)
{
return std::find(start, end, std::not1(::isdigit)) == end;
}
當然,你可以只寫一個循環
template<typename FwdIter>
bool all_digits(FwdIter start, FwdIter end)
{
for(; start != end; ++start)
{
if(!::isdigit(*start))
return false;
}
return true;
}
這並不能完全告訴你如果輸入字符串表示正數,因爲它們可能都是零,並且字符串可能爲空。我們可以很容易地在循環版中覆蓋它。
template<typename FwdIter>
bool is_positive_int(FwdIter start, FwdIter end)
{
bool foundNonZero;
for(; start != end; ++start)
{
if(!::isdigit(*start))
return false;
if(*start > '0') // it must be a digit
foundNonZero = true;
}
return foundNonZero;
}
假設:
檢查第一,遍歷其餘部分,易於peasy。
0143怎麼樣?還是0x12? – 2011-01-07 12:23:59
這的確是很簡單,但它取決於需求/允許輸入:
+
?基於上述,您可能需要:
+
這個問題也是你需要驗證的數字,例如輸入123+456
您可以編寫一個簡單的狀態機,如果需要,可以完成上述所有操作。
編輯
如果我理解你的要求,一個子系統正整數轉換爲字符串這是最終得到想要驗證什麼都沒有發生,以輸入另一個子系統。如果你知道你的int-to-string轉換,這個任務就容易多了:假設沒有空白,沒有前導零,沒有前導+
,比你的任務確實是第一個答案中的「easy-peasy」:)
我沒有得到您的最後一段 - 誰轉換,誰驗證,爲什麼。讀取像你轉換一個int字符串比驗證轉換? – davka 2011-01-07 12:41:16
你的整數的預期格式是什麼?十進制,十六進制,八進制,科學記數法? – 2011-01-07 12:48:10