2011-01-07 49 views
0

我不需要知道int是什麼,我只需要知道它是否是一個十進制表示中的正整數表示,不帶前導0。如何檢查字符串是否表示正的非零整數?

這將被要求大量的記錄,所以我希望它是儘可能便宜的檢查。

預期的行爲是系統永遠不應該被傳遞一些無法驗證的東西(因爲它通常是通過int轉換爲字符串進行存儲的),所以這只是最終的安全檢查,以確保沒有任何奇怪的事情發生。

+0

我沒有得到您的最後一段 - 誰轉換,誰驗證,爲什麼。讀取像你轉換一個int字符串比驗證轉換? – davka 2011-01-07 12:41:16

+1

你的整數的預期格式是什麼?十進制,十六進制,八進制,科學記數法? – 2011-01-07 12:48:10

回答

3

雖然你實際上可以經歷實際將其轉換爲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; 
} 

假設:

  • 你可能有前導零(但 必須至少有一個非零的 有),所以0234是一個有效的正 數
  • 沒有空格允許
2
  • 第一字符必須是1一個貫通9
  • 所有其它的字符必須是0一個貫通9

檢查第一,遍歷其餘部分,易於peasy。

+0

0143怎麼樣?還是0x12? – 2011-01-07 12:23:59

0

這的確是很簡單,但它取決於需求/允許輸入:

  • 什麼代表性/基礎被允許:二進制,八進制,十六進制? (主要區別是由十六進制,你的數字設置是不同的)
  • 是領先和尾隨空白允許(你的輸入是一個字符串,你不應該忽視這一點,除非你承諾它不會發生)
  • 是領先的允許零點?
  • 是否允許導致+

基於上述,您可能需要:

  • 帶前後空白
  • 掃描串檢查它僅包含了允許數字和+
  • 驗證它包含至少一個非零數字

這個問題也是你需要驗證的數字,例如輸入123+456

您可以編寫一個簡單的狀態機,如果需要,可以完成上述所有操作。

編輯

如果我理解你的要求,一個子系統正整數轉換爲字符串這是最終得到想要驗證什麼都沒有發生,以輸入另一個子系統。如果你知道你的int-to-string轉換,這個任務就容易多了:假設沒有空白,沒有前導零,沒有前導+,比你的任務確實是第一個答案中的「easy-peasy」:)

相關問題